Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

546 lines
16 KiB

  1. /*++
  2. Copyright (c) 1990-2001 Microsoft Corporation
  3. Module Name:
  4. kddata.c
  5. Abstract:
  6. This module contains global data for the portable kernel debgger.
  7. Author:
  8. Mark Lucovsky 1-Nov-1993
  9. Revision History:
  10. --*/
  11. #include "kdp.h"
  12. #include "ke.h"
  13. #include "pool.h"
  14. #include "stdio.h"
  15. //
  16. // Miscellaneous data from all over the kernel
  17. //
  18. #if !defined(_TRUSTED_WINDOWS_)
  19. extern PHANDLE_TABLE PspCidTable;
  20. extern LIST_ENTRY ExpSystemResourcesList;
  21. extern PPOOL_DESCRIPTOR ExpPagedPoolDescriptor;
  22. extern ULONG ExpNumberOfPagedPools;
  23. extern ULONG KeTimeIncrement;
  24. extern LIST_ENTRY KeBugCheckCallbackListHead;
  25. extern ULONG_PTR KiBugCheckData[];
  26. extern LIST_ENTRY IopErrorLogListHead;
  27. extern POBJECT_DIRECTORY ObpRootDirectoryObject;
  28. extern POBJECT_TYPE ObpTypeObjectType;
  29. extern PVOID MmSystemCacheStart;
  30. extern PVOID MmSystemCacheEnd;
  31. extern PVOID MmPfnDatabase;
  32. extern ULONG MmSystemPtesStart[];
  33. extern ULONG MmSystemPtesEnd[];
  34. extern ULONG MmSubsectionBase;
  35. extern ULONG MmNumberOfPagingFiles;
  36. extern PFN_COUNT MmNumberOfPhysicalPages;
  37. extern ULONG MmMaximumNonPagedPoolInBytes;
  38. extern PVOID MmNonPagedSystemStart;
  39. extern PVOID MmNonPagedPoolStart;
  40. extern PVOID MmNonPagedPoolEnd;
  41. extern PVOID MmPagedPoolStart;
  42. extern PVOID MmPagedPoolEnd;
  43. extern ULONG MmPagedPoolInfo[];
  44. extern ULONG MmSizeOfPagedPoolInBytes;
  45. extern ULONG MmSharedCommit;
  46. extern ULONG MmDriverCommit;
  47. extern ULONG MmProcessCommit;
  48. extern ULONG MmPagedPoolCommit;
  49. extern MMPFNLIST MmZeroedPageListHead;
  50. extern MMPFNLIST MmFreePageListHead;
  51. extern MMPFNLIST MmStandbyPageListHead;
  52. extern MMPFNLIST MmModifiedPageListHead;
  53. extern MMPFNLIST MmModifiedNoWritePageListHead;
  54. extern ULONG MmAvailablePages;
  55. extern LONG MmResidentAvailablePages;
  56. extern LIST_ENTRY MmLoadedUserImageList;
  57. extern PPOOL_TRACKER_TABLE PoolTrackTable;
  58. extern POOL_DESCRIPTOR NonPagedPoolDescriptor;
  59. extern PUNLOADED_DRIVERS MmUnloadedDrivers;
  60. extern ULONG MmLastUnloadedDriver;
  61. extern ULONG MmTriageActionTaken;
  62. extern ULONG MmSpecialPoolTag;
  63. extern LOGICAL KernelVerifier;
  64. extern PVOID MmVerifierData;
  65. extern PFN_NUMBER MmAllocatedNonPagedPool;
  66. extern SIZE_T MmPeakCommitment;
  67. extern SIZE_T MmTotalCommitLimitMaximum;
  68. extern ULONG_PTR MmSessionBase;
  69. extern ULONG_PTR MmSessionSize;
  70. #ifdef _IA64_
  71. extern PFN_NUMBER MmSystemParentTablePage;
  72. #endif
  73. extern ULONG IopNumTriageDumpDataBlocks;
  74. extern PVOID IopTriageDumpDataBlocks[];
  75. #endif
  76. //
  77. // These blocks of data needs to always be present because crashdumps
  78. // need the information. Otherwise, things like PAGE_SIZE are not available
  79. // in crashdumps, and extensions like !pool fail.
  80. //
  81. DBGKD_GET_VERSION64 KdVersionBlock = {
  82. 0,
  83. 0,
  84. DBGKD_64BIT_PROTOCOL_VERSION2,
  85. #if defined(_M_AMD64)
  86. DBGKD_VERS_FLAG_PTR64 | DBGKD_VERS_FLAG_DATA,
  87. IMAGE_FILE_MACHINE_AMD64,
  88. #elif defined(_M_IX86)
  89. DBGKD_VERS_FLAG_DATA,
  90. IMAGE_FILE_MACHINE_I386,
  91. #elif defined(_M_IA64)
  92. DBGKD_VERS_FLAG_HSS| DBGKD_VERS_FLAG_PTR64 | DBGKD_VERS_FLAG_DATA,
  93. IMAGE_FILE_MACHINE_IA64,
  94. #endif
  95. PACKET_TYPE_MAX,
  96. 0,
  97. 0,
  98. 0,
  99. 0,
  100. 0,
  101. 0,
  102. 0
  103. };
  104. #if defined(_TRUSTED_WINDOWS_)
  105. #define TW_EXCLUDE(_data_) 0
  106. #else
  107. #define TW_EXCLUDE(_data_) _data_
  108. #endif
  109. KDDEBUGGER_DATA64 KdDebuggerDataBlock = {
  110. {0}, // DBGKD_DEBUG_DATA_HEADER Header;
  111. (ULONG64)0,
  112. (ULONG64)RtlpBreakWithStatusInstruction,
  113. (ULONG64)0,
  114. (USHORT)FIELD_OFFSET(KTHREAD, CallbackStack), // USHORT ThCallbackStack;
  115. #if defined(_AMD64_)
  116. (USHORT)FIELD_OFFSET(KCALLOUT_FRAME, CallbackStack), // USHORT NextCallback;
  117. #else
  118. (USHORT)FIELD_OFFSET(KCALLOUT_FRAME, CbStk), // USHORT NextCallback;
  119. #endif
  120. #if defined(_X86_)
  121. (USHORT)FIELD_OFFSET(KCALLOUT_FRAME, Ebp),
  122. #else
  123. (USHORT)0, // USHORT FramePointer;
  124. #endif
  125. #if defined(_X86PAE_) || defined(_AMD64_)
  126. (USHORT)1,
  127. #else
  128. (USHORT)0, // USHORT PaeEnabled;
  129. #endif
  130. (ULONG64) TW_EXCLUDE(KiCallUserMode),
  131. (ULONG64)0,
  132. (ULONG64)&PsLoadedModuleList,
  133. (ULONG64) TW_EXCLUDE(&PsActiveProcessHead),
  134. (ULONG64) TW_EXCLUDE(&PspCidTable),
  135. (ULONG64) TW_EXCLUDE(&ExpSystemResourcesList),
  136. (ULONG64) TW_EXCLUDE(&ExpPagedPoolDescriptor),
  137. (ULONG64) TW_EXCLUDE(&ExpNumberOfPagedPools),
  138. (ULONG64)&KeTimeIncrement,
  139. (ULONG64) TW_EXCLUDE(&KeBugCheckCallbackListHead),
  140. (ULONG64) TW_EXCLUDE(KiBugCheckData),
  141. (ULONG64) TW_EXCLUDE(&IopErrorLogListHead),
  142. (ULONG64) TW_EXCLUDE(&ObpRootDirectoryObject),
  143. (ULONG64) TW_EXCLUDE(&ObpTypeObjectType),
  144. (ULONG64) TW_EXCLUDE(&MmSystemCacheStart),
  145. (ULONG64) TW_EXCLUDE(&MmSystemCacheEnd),
  146. (ULONG64) TW_EXCLUDE(&MmSystemCacheWs),
  147. (ULONG64) TW_EXCLUDE(&MmPfnDatabase),
  148. (ULONG64) TW_EXCLUDE(MmSystemPtesStart),
  149. (ULONG64) TW_EXCLUDE(MmSystemPtesEnd),
  150. (ULONG64) TW_EXCLUDE(&MmSubsectionBase),
  151. (ULONG64) TW_EXCLUDE(&MmNumberOfPagingFiles),
  152. (ULONG64) TW_EXCLUDE(&MmLowestPhysicalPage),
  153. (ULONG64) TW_EXCLUDE(&MmHighestPhysicalPage),
  154. (ULONG64) TW_EXCLUDE(&MmNumberOfPhysicalPages),
  155. (ULONG64) TW_EXCLUDE(&MmMaximumNonPagedPoolInBytes),
  156. (ULONG64) TW_EXCLUDE(&MmNonPagedSystemStart),
  157. (ULONG64) TW_EXCLUDE(&MmNonPagedPoolStart),
  158. (ULONG64) TW_EXCLUDE(&MmNonPagedPoolEnd),
  159. (ULONG64) TW_EXCLUDE(&MmPagedPoolStart),
  160. (ULONG64) TW_EXCLUDE(&MmPagedPoolEnd),
  161. (ULONG64) TW_EXCLUDE(&MmPagedPoolInfo),
  162. (ULONG64) PAGE_SIZE,
  163. (ULONG64) TW_EXCLUDE(&MmSizeOfPagedPoolInBytes),
  164. (ULONG64) TW_EXCLUDE(&MmTotalCommitLimit),
  165. (ULONG64) TW_EXCLUDE(&MmTotalCommittedPages),
  166. (ULONG64) TW_EXCLUDE(&MmSharedCommit),
  167. (ULONG64) TW_EXCLUDE(&MmDriverCommit),
  168. (ULONG64) TW_EXCLUDE(&MmProcessCommit),
  169. (ULONG64) TW_EXCLUDE(&MmPagedPoolCommit),
  170. (ULONG64)0,
  171. (ULONG64) TW_EXCLUDE(&MmZeroedPageListHead),
  172. (ULONG64) TW_EXCLUDE(&MmFreePageListHead),
  173. (ULONG64) TW_EXCLUDE(&MmStandbyPageListHead),
  174. (ULONG64) TW_EXCLUDE(&MmModifiedPageListHead),
  175. (ULONG64) TW_EXCLUDE(&MmModifiedNoWritePageListHead),
  176. (ULONG64) TW_EXCLUDE(&MmAvailablePages),
  177. (ULONG64) TW_EXCLUDE(&MmResidentAvailablePages),
  178. (ULONG64) TW_EXCLUDE(&PoolTrackTable),
  179. (ULONG64) TW_EXCLUDE(&NonPagedPoolDescriptor),
  180. (ULONG64) TW_EXCLUDE(&MmHighestUserAddress),
  181. (ULONG64) TW_EXCLUDE(&MmSystemRangeStart),
  182. (ULONG64) TW_EXCLUDE(&MmUserProbeAddress),
  183. (ULONG64)KdPrintDefaultCircularBuffer,
  184. (ULONG64)KdPrintDefaultCircularBuffer +
  185. sizeof(KdPrintDefaultCircularBuffer),
  186. (ULONG64)&KdPrintWritePointer,
  187. (ULONG64)&KdPrintRolloverCount,
  188. (ULONG64) TW_EXCLUDE(&MmLoadedUserImageList),
  189. // Nt 5.1 additions
  190. (ULONG64) TW_EXCLUDE(NtBuildLab),
  191. #if defined(_IA64_)
  192. (ULONG64)KiNormalSystemCall,
  193. #else
  194. (ULONG64)0,
  195. #endif
  196. //
  197. (ULONG64)KiProcessorBlock,
  198. (ULONG64) TW_EXCLUDE(&MmUnloadedDrivers),
  199. (ULONG64) TW_EXCLUDE(&MmLastUnloadedDriver),
  200. (ULONG64) TW_EXCLUDE(&MmTriageActionTaken),
  201. (ULONG64) TW_EXCLUDE(&MmSpecialPoolTag),
  202. (ULONG64) TW_EXCLUDE(&KernelVerifier),
  203. (ULONG64) TW_EXCLUDE(&MmVerifierData),
  204. (ULONG64) TW_EXCLUDE(&MmAllocatedNonPagedPool),
  205. (ULONG64) TW_EXCLUDE(&MmPeakCommitment),
  206. (ULONG64) TW_EXCLUDE(&MmTotalCommitLimitMaximum),
  207. (ULONG64) TW_EXCLUDE(&CmNtCSDVersion),
  208. // Nt 5.1 additions
  209. (ULONG64)&MmPhysicalMemoryBlock,
  210. (ULONG64) TW_EXCLUDE(&MmSessionBase),
  211. (ULONG64) TW_EXCLUDE(&MmSessionSize),
  212. #ifdef _IA64_
  213. (ULONG64) TW_EXCLUDE(&MmSystemParentTablePage),
  214. #else
  215. 0,
  216. #endif
  217. // .NET Server additions
  218. 0, // MmVirtualTranslationBase is filled out at init time.
  219. (USHORT)FIELD_OFFSET(KTHREAD, NextProcessor),
  220. (USHORT)FIELD_OFFSET(KTHREAD, Teb),
  221. (USHORT)FIELD_OFFSET(KTHREAD, KernelStack),
  222. (USHORT)FIELD_OFFSET(KTHREAD, InitialStack),
  223. (USHORT)FIELD_OFFSET(KTHREAD, ApcState.Process),
  224. (USHORT)FIELD_OFFSET(KTHREAD, State),
  225. #ifdef _IA64_
  226. (USHORT)FIELD_OFFSET(KTHREAD, InitialBStore),
  227. (USHORT)FIELD_OFFSET(KTHREAD, BStoreLimit),
  228. #else
  229. 0,
  230. 0,
  231. #endif
  232. (USHORT)sizeof(EPROCESS),
  233. (USHORT)FIELD_OFFSET(EPROCESS, Peb),
  234. (USHORT)FIELD_OFFSET(EPROCESS, InheritedFromUniqueProcessId),
  235. (USHORT)FIELD_OFFSET(KPROCESS, DirectoryTableBase),
  236. (USHORT)sizeof(KPRCB),
  237. (USHORT)FIELD_OFFSET(KPRCB, DpcRoutineActive),
  238. (USHORT)FIELD_OFFSET(KPRCB, CurrentThread),
  239. (USHORT)FIELD_OFFSET(KPRCB, MHz),
  240. #ifdef _IA64_
  241. (USHORT)FIELD_OFFSET(KPRCB, ProcessorModel),
  242. (USHORT)FIELD_OFFSET(KPRCB, ProcessorVendorString),
  243. #else
  244. (USHORT)FIELD_OFFSET(KPRCB, CpuType),
  245. (USHORT)FIELD_OFFSET(KPRCB, VendorString),
  246. #endif
  247. (USHORT)FIELD_OFFSET(KPRCB, ProcessorState),
  248. (USHORT)FIELD_OFFSET(KPRCB, Number),
  249. (USHORT)sizeof(ETHREAD),
  250. (ULONG64)&KdPrintCircularBuffer,
  251. (ULONG64)&KdPrintBufferSize,
  252. (ULONG64)&KeLoaderBlock,
  253. (USHORT)0,
  254. (USHORT)0,
  255. (USHORT)0,
  256. (USHORT)0,
  257. (USHORT)0,
  258. (USHORT)0,
  259. (USHORT)0,
  260. (USHORT)0,
  261. (USHORT)0,
  262. (USHORT)0,
  263. (USHORT)0,
  264. (USHORT)0,
  265. (USHORT)0,
  266. (USHORT)0,
  267. (USHORT)0,
  268. (USHORT)0,
  269. (USHORT)0,
  270. (USHORT)0,
  271. (USHORT)0,
  272. (USHORT)0,
  273. (ULONG64)TW_EXCLUDE(&IopNumTriageDumpDataBlocks),
  274. (ULONG64)TW_EXCLUDE(IopTriageDumpDataBlocks),
  275. };
  276. //
  277. // Initialize the component name debug print filter table.
  278. //
  279. ULONG Kd_WIN2000_Mask = 1;
  280. #include "dpfilter.c"
  281. ULONG KdComponentTableSize = sizeof(KdComponentTable) / sizeof(PULONG);
  282. //
  283. // All dta from here on will be paged out if the kernel debugger is
  284. // not enabled.
  285. //
  286. #ifdef _X86_
  287. #pragma data_seg("PAGEKDD")
  288. #endif // _X86_
  289. UCHAR KdPrintDefaultCircularBuffer[KDPRINTDEFAULTBUFFERSIZE] = {0};
  290. PUCHAR KdPrintCircularBuffer = KdPrintDefaultCircularBuffer;
  291. ULONG KdPrintBufferSize = KDPRINTDEFAULTBUFFERSIZE;
  292. PUCHAR KdPrintWritePointer = KdPrintDefaultCircularBuffer;
  293. ULONG KdPrintRolloverCount = 0;
  294. ULONG KdPrintBufferChanges = 0;
  295. BREAKPOINT_ENTRY KdpBreakpointTable[BREAKPOINT_TABLE_SIZE] = {0};
  296. // The message buffer needs to be 64-bit aligned.
  297. UCHAR DECLSPEC_ALIGN(8) KdpMessageBuffer[KDP_MESSAGE_BUFFER_SIZE] = {0};
  298. UCHAR KdpPathBuffer[KDP_MESSAGE_BUFFER_SIZE] = {0};
  299. DBGKD_INTERNAL_BREAKPOINT KdpInternalBPs[DBGKD_MAX_INTERNAL_BREAKPOINTS] = {0};
  300. KD_REMOTE_FILE KdpRemoteFiles[KD_MAX_REMOTE_FILES];
  301. LARGE_INTEGER KdPerformanceCounterRate = {0,0};
  302. LARGE_INTEGER KdTimerStart = {0,0} ;
  303. LARGE_INTEGER KdTimerStop = {0,0};
  304. LARGE_INTEGER KdTimerDifference = {0,0};
  305. ULONG_PTR KdpCurrentSymbolStart = 0;
  306. ULONG_PTR KdpCurrentSymbolEnd = 0;
  307. LONG KdpNextCallLevelChange = 0; // used only over returns to the debugger.
  308. ULONG_PTR KdSpecialCalls[DBGKD_MAX_SPECIAL_CALLS] = {0};
  309. ULONG KdNumberOfSpecialCalls = 0;
  310. ULONG_PTR InitialSP = 0;
  311. ULONG KdpNumInternalBreakpoints = 0;
  312. KTIMER InternalBreakpointTimer = {0};
  313. KDPC InternalBreakpointCheckDpc = {0};
  314. BOOLEAN KdpPortLocked = FALSE;
  315. DBGKD_TRACE_DATA TraceDataBuffer[TRACE_DATA_BUFFER_MAX_SIZE] = {0};
  316. ULONG TraceDataBufferPosition = 1; // Element # to write next
  317. // Recall elt 0 is a length
  318. TRACE_DATA_SYM TraceDataSyms[256] = {0};
  319. UCHAR NextTraceDataSym = 0; // what's the next one to be replaced
  320. UCHAR NumTraceDataSyms = 0; // how many are valid?
  321. ULONG IntBPsSkipping = 0; // number of exceptions that are being skipped
  322. // now
  323. BOOLEAN WatchStepOver = FALSE;
  324. BOOLEAN BreakPointTimerStarted = FALSE;
  325. PVOID WSOThread = NULL; // thread doing stepover
  326. ULONG_PTR WSOEsp = 0; // stack pointer of thread doing stepover (yes, we need it)
  327. ULONG WatchStepOverHandle = 0;
  328. ULONG_PTR WatchStepOverBreakAddr = 0; // where the WatchStepOver break is set
  329. BOOLEAN WatchStepOverSuspended = FALSE;
  330. ULONG InstructionsTraced = 0;
  331. BOOLEAN SymbolRecorded = FALSE;
  332. LONG CallLevelChange = 0;
  333. LONG_PTR oldpc = 0;
  334. BOOLEAN InstrCountInternal = FALSE; // Processing a non-COUNTONLY?
  335. BOOLEAN BreakpointsSuspended = FALSE;
  336. BOOLEAN KdpControlCPressed = FALSE;
  337. KDP_BREAKPOINT_TYPE KdpBreakpointInstruction = KDP_BREAKPOINT_VALUE;
  338. KD_CONTEXT KdpContext;
  339. LIST_ENTRY KdpDebuggerDataListHead = {NULL,NULL};
  340. //
  341. // !search support variables (page hit database)
  342. //
  343. PFN_NUMBER KdpSearchPageHits [SEARCH_PAGE_HIT_DATABASE_SIZE] = {0};
  344. ULONG KdpSearchPageHitOffsets [SEARCH_PAGE_HIT_DATABASE_SIZE] = {0};
  345. ULONG KdpSearchPageHitIndex = 0;
  346. LOGICAL KdpSearchInProgress = FALSE;
  347. PFN_NUMBER KdpSearchStartPageFrame = 0;
  348. PFN_NUMBER KdpSearchEndPageFrame = 0;
  349. ULONG_PTR KdpSearchAddressRangeStart = 0;
  350. ULONG_PTR KdpSearchAddressRangeEnd = 0;
  351. PFN_NUMBER KdpSearchPfnValue = 0;
  352. ULONG KdpSearchCheckPoint = KDP_SEARCH_SYMBOL_CHECK;
  353. BOOLEAN KdpDebuggerStructuresInitialized = FALSE;
  354. #ifdef _X86_
  355. #ifdef ALLOC_PRAGMA
  356. #pragma data_seg()
  357. #endif
  358. #endif // _X86_
  359. KSPIN_LOCK KdpPrintSpinLock = 0;
  360. KSPIN_LOCK KdpDataSpinLock = 0;
  361. #if !defined(_TRUSTED_WINDOWS_)
  362. KSPIN_LOCK KdpTimeSlipEventLock = 0;
  363. PVOID KdpTimeSlipEvent = NULL;
  364. KDPC KdpTimeSlipDpc = {0};
  365. WORK_QUEUE_ITEM KdpTimeSlipWorkItem = {NULL};
  366. KTIMER KdpTimeSlipTimer = {0};
  367. ULONG KdpTimeSlipPending = 1;
  368. #endif
  369. BOOLEAN KdDebuggerNotPresent = FALSE;
  370. BOOLEAN KdDebuggerEnabled = FALSE;
  371. BOOLEAN KdAutoEnableOnEvent = FALSE;
  372. BOOLEAN KdPitchDebugger = TRUE;
  373. BOOLEAN KdpOweBreakpoint = FALSE;
  374. BOOLEAN KdIgnoreUmExceptions = FALSE;
  375. ULONG KdEnteredDebugger = FALSE;
  376. #if 0
  377. #if !defined (PERF_DATA)
  378. #if defined(_AMD64_)
  379. C_ASSERT(sizeof(KPRCB) == AMD64_KPRCB_SIZE);
  380. C_ASSERT(sizeof(EPROCESS) == AMD64_EPROCESS_SIZE);
  381. C_ASSERT(FIELD_OFFSET(EPROCESS, Peb) == AMD64_PEB_IN_EPROCESS);
  382. C_ASSERT(sizeof(ETHREAD) == AMD64_ETHREAD_SIZE);
  383. C_ASSERT(sizeof(CONTEXT) == sizeof(AMD64_CONTEXT));
  384. C_ASSERT(sizeof(KSPECIAL_REGISTERS) == sizeof(AMD64_KSPECIAL_REGISTERS));
  385. C_ASSERT(FIELD_OFFSET(KTHREAD, NextProcessor) == AMD64_KTHREAD_NEXTPROCESSOR_OFFSET);
  386. C_ASSERT(FIELD_OFFSET(KTHREAD, Teb) == AMD64_KTHREAD_TEB_OFFSET);
  387. #elif defined(_X86_)
  388. C_ASSERT(sizeof(KPRCB) == X86_NT51_KPRCB_SIZE);
  389. C_ASSERT(sizeof(EPROCESS) == X86_NT511_EPROCESS_SIZE);
  390. C_ASSERT(FIELD_OFFSET(EPROCESS, Peb) == X86_PEB_IN_EPROCESS);
  391. C_ASSERT(sizeof(ETHREAD) == X86_ETHREAD_SIZE);
  392. C_ASSERT(sizeof(CONTEXT) == sizeof(X86_NT5_CONTEXT));
  393. C_ASSERT(sizeof(KSPECIAL_REGISTERS) == sizeof(X86_KSPECIAL_REGISTERS));
  394. C_ASSERT(FIELD_OFFSET(KTHREAD, NextProcessor) == X86_3555_KTHREAD_NEXTPROCESSOR_OFFSET);
  395. C_ASSERT(FIELD_OFFSET(KTHREAD, Teb) == X86_3555_KTHREAD_TEB_OFFSET);
  396. #elif defined(_IA64_)
  397. C_ASSERT(sizeof(KPRCB) == IA64_KPRCB_SIZE);
  398. C_ASSERT(sizeof(EPROCESS) == IA64_EPROCESS_SIZE);
  399. C_ASSERT(FIELD_OFFSET(EPROCESS, Peb) == IA64_3555_PEB_IN_EPROCESS);
  400. C_ASSERT(sizeof(ETHREAD) == IA64_3555_ETHREAD_SIZE);
  401. C_ASSERT(sizeof(CONTEXT) == sizeof(IA64_CONTEXT));
  402. C_ASSERT(sizeof(KSPECIAL_REGISTERS) == sizeof(IA64_KSPECIAL_REGISTERS));
  403. C_ASSERT(FIELD_OFFSET(KTHREAD, NextProcessor) == IA64_3555_KTHREAD_NEXTPROCESSOR_OFFSET);
  404. C_ASSERT(FIELD_OFFSET(KTHREAD, Teb) == IA64_3555_KTHREAD_TEB_OFFSET);
  405. #include <ia64\miia64.h>
  406. C_ASSERT(IA64_PAGE_SIZE == PAGE_SIZE);
  407. C_ASSERT(IA64_PAGE_SHIFT == PAGE_SHIFT);
  408. C_ASSERT(IA64_MM_PTE_TRANSITION_MASK == MM_PTE_TRANSITION_MASK);
  409. C_ASSERT(IA64_MM_PTE_PROTOTYPE_MASK == MM_PTE_PROTOTYPE_MASK);
  410. #else
  411. #error "no target architecture"
  412. #endif
  413. #endif
  414. #endif