// Dependencies
//
+//
+// KPCR Access for non-IA64 builds
+//
+#define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
+#define PCR ((KPCR * const)K0IPCR)
+#if defined(CONFIG_SMP) || defined(NT_BUILD)
+#undef KeGetPcr
+#define KeGetPcr() ((KPCR * const)__readfsdword(FIELD_OFFSET(KPCR, SelfPcr)))
+#endif
+
//
// Machine Types
//
#define KGDT_DF_TSS 0x50
#define KGDT_NMI_TSS 0x58
+//
+// Define the number of GDTs that can be queried by user mode
+//
+#define KGDT_NUMBER 10
+
//
// CR4
//
#define EFLAGS_TF 0x100L
#define EFLAGS_INTERRUPT_MASK 0x200L
#define EFLAGS_DF 0x400L
+#define EFLAGS_IOPL 0x3000L
#define EFLAGS_NESTED_TASK 0x4000L
+#define EFLAGS_RF 0x10000
#define EFLAGS_V86_MASK 0x20000
#define EFLAGS_ALIGN_CHECK 0x40000
#define EFLAGS_VIF 0x80000
#define EFLAGS_VIP 0x100000
+#define EFLAGS_ID 0x200000
+#define EFLAGS_USER_SANITIZE 0x3F4DD7
#define EFLAG_SIGN 0x8000
#define EFLAG_ZERO 0x4000
+//
+// Legacy floating status word bit masks.
+//
+#define FSW_INVALID_OPERATION 0x1
+#define FSW_DENORMAL 0x2
+#define FSW_ZERO_DIVIDE 0x4
+#define FSW_OVERFLOW 0x8
+#define FSW_UNDERFLOW 0x10
+#define FSW_PRECISION 0x20
+#define FSW_STACK_FAULT 0x40
+
//
// IPI Types
//
#define IPI_PACKET_READY 8
#define IPI_SYNCH_REQUEST 16
+//
+// PRCB Flags
+//
+#define PRCB_MAJOR_VERSION 1
+#define PRCB_BUILD_DEBUG 1
+#define PRCB_BUILD_UNIPROCESSOR 2
+
+//
+// HAL Variables
+//
+#define INITIAL_STALL_COUNT 100
+
+//
+// IOPM Definitions
+//
+#define IOPM_COUNT 1
+#define IOPM_SIZE 8192
+#define IOPM_FULL_SIZE 8196
+#define IO_ACCESS_MAP_NONE 0
+#define IOPM_DIRECTION_MAP_SIZE 32
+#define IOPM_OFFSET FIELD_OFFSET(KTSS, IoMaps[0].IoMap)
+#define KiComputeIopmOffset(MapNumber) \
+ (MapNumber == IO_ACCESS_MAP_NONE) ? \
+ (USHORT)(sizeof(KTSS)) : \
+ (USHORT)(FIELD_OFFSET(KTSS, IoMaps[MapNumber-1].IoMap))
+
+//
+// Size of the XMM register save area in the FXSAVE format
+//
+#define SIZE_OF_FX_REGISTERS 128
+
//
// Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
//
#define KSEG0_BASE 0x80000000
//
-// Macro to get current KPRCB
+// Synchronization-level IRQL
//
-#ifndef _REACTOS_ // fixme
-#define KeGetCurrentPrcb() \
- (PKPRCB)__readfsdword(KPCR_PRCB);
+#ifndef CONFIG_SMP
+#define SYNCH_LEVEL DISPATCH_LEVEL
+#else
+#if (NTDDI_VERSION < NTDDI_WS03)
+#define SYNCH_LEVEL (IPI_LEVEL - 1)
+#else
+#define SYNCH_LEVEL (IPI_LEVEL - 2)
+#endif
#endif
//
ULONG V86Gs;
} KTRAP_FRAME, *PKTRAP_FRAME;
+//
+// Defines the Callback Stack Layout for User Mode Callbacks
+//
+typedef struct _KCALLOUT_FRAME
+{
+ ULONG InitialStack;
+ ULONG TrapFrame;
+ ULONG CallbackStack;
+ ULONG Edi;
+ ULONG Esi;
+ ULONG Ebx;
+ ULONG Ebp;
+ ULONG ReturnAddress;
+ ULONG Result;
+ ULONG ResultLength;
+} KCALLOUT_FRAME, *PKCALLOUT_FRAME;
+
//
// LDT Entry Definition
//
USHORT ExtendedOffset;
} KIDTENTRY, *PKIDTENTRY;
-#include <pshpack2.h>
typedef struct _DESCRIPTOR
{
+ USHORT Pad;
USHORT Limit;
ULONG Base;
- USHORT Padding;
} KDESCRIPTOR, *PKDESCRIPTOR;
-#include <poppack.h>
#ifndef NTOS_MODE_USER
+//
+// Macro to get current KPRCB
+//
+FORCEINLINE
+struct _KPRCB *
+KeGetCurrentPrcb(VOID)
+{
+ return (struct _KPRCB *)(ULONG_PTR)__readfsdword(FIELD_OFFSET(KPCR, Prcb));
+}
//
// FN/FX (FPU) Save Area Structures
ULONG DataSelector;
ULONG MXCsr;
ULONG MXCsrMask;
- UCHAR RegisterArea[128];
+ UCHAR RegisterArea[SIZE_OF_FX_REGISTERS];
UCHAR Reserved3[128];
UCHAR Reserved4[224];
UCHAR Align16Byte[8];
//
// Processor State Data
//
-#pragma pack(push,4)
typedef struct _KPROCESSOR_STATE
{
CONTEXT ContextFrame;
//
// Processor Region Control Block
//
+#pragma pack(push,4)
typedef struct _KPRCB
{
USHORT MinorVersion;
ULONG CFlushSize;
UCHAR PrcbPad0[88];
#else
- ULONG CFlushSize;
UCHAR PrcbPad0[92];
#endif
KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
#endif
ULONG SpareCounter0;
#if (NTDDI_VERSION < NTDDI_LONGHORN)
- ULONG KeContextSwitches;
ULONG KeDcacheFlushCount;
ULONG KeExceptionDispatchCount;
ULONG KeFirstLevelTbFills;
ULONG KeSecondLevelTbFills;
ULONG KeSystemCalls;
#endif
- ULONG IoReadOperationCount;
- ULONG IoWriteOperationCount;
- ULONG IoOtherOperationCount;
+ volatile ULONG IoReadOperationCount;
+ volatile ULONG IoWriteOperationCount;
+ volatile ULONG IoOtherOperationCount;
LARGE_INTEGER IoReadTransferCount;
LARGE_INTEGER IoWriteTransferCount;
LARGE_INTEGER IoOtherTransferCount;
PP_LOOKASIDE_LIST PPLookasideList[16];
PP_LOOKASIDE_LIST PPNPagedLookasideList[32];
PP_LOOKASIDE_LIST PPPagedLookasideList[32];
- ULONG PacketBarrier;
- ULONG ReverseStall;
+ volatile ULONG PacketBarrier;
+ volatile ULONG ReverseStall;
PVOID IpiFrame;
UCHAR PrcbPad2[52];
- PVOID CurrentPacket[3];
- ULONG TargetSet;
- PKIPI_WORKER WorkerRoutine;
- ULONG IpiFrozen;
+ volatile PVOID CurrentPacket[3];
+ volatile ULONG TargetSet;
+ volatile PKIPI_WORKER WorkerRoutine;
+ volatile ULONG IpiFrozen;
UCHAR PrcbPad3[40];
- ULONG RequestSummary;
- struct _KPRCB *SignalDone;
+ volatile ULONG RequestSummary;
+ volatile struct _KPRCB *SignalDone;
UCHAR PrcbPad4[56];
struct _KDPC_DATA DpcData[2];
PVOID DpcStack;
ULONG MaximumDpcQueueDepth;
ULONG DpcRequestRate;
ULONG MinimumDpcRate;
- UCHAR DpcInterruptRequested;
- UCHAR DpcThreadRequested;
- UCHAR DpcRoutineActive;
- UCHAR DpcThreadActive;
+ volatile UCHAR DpcInterruptRequested;
+ volatile UCHAR DpcThreadRequested;
+ volatile UCHAR DpcRoutineActive;
+ volatile UCHAR DpcThreadActive;
ULONG PrcbLock;
ULONG DpcLastCount;
- ULONG TimerHand;
- ULONG TimerRequest;
+ volatile ULONG TimerHand;
+ volatile ULONG TimerRequest;
PVOID DpcThread;
KEVENT DpcEvent;
UCHAR ThreadDpcEnable;
- BOOLEAN QuantumEnd;
+ volatile BOOLEAN QuantumEnd;
UCHAR PrcbPad50;
- UCHAR IdleSchedule;
+ volatile UCHAR IdleSchedule;
LONG DpcSetEventRequest;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
LONG Sleeping;
#endif
PVOID ChainedInterruptList;
LONG LookasideIrpFloat;
- LONG MmPageFaultCount;
- LONG MmCopyOnWriteCount;
- LONG MmTransitionCount;
- LONG MmCacheTransitionCount;
- LONG MmDemandZeroCount;
- LONG MmPageReadCount;
- LONG MmPageReadIoCount;
- LONG MmCacheReadCount;
- LONG MmCacheIoCount;
- LONG MmDirtyPagesWriteCount;
- LONG MmDirtyWriteIoCount;
- LONG MmMappedPagesWriteCount;
- LONG MmMappedWriteIoCount;
+ volatile LONG MmPageFaultCount;
+ volatile LONG MmCopyOnWriteCount;
+ volatile LONG MmTransitionCount;
+ volatile LONG MmCacheTransitionCount;
+ volatile LONG MmDemandZeroCount;
+ volatile LONG MmPageReadCount;
+ volatile LONG MmPageReadIoCount;
+ volatile LONG MmCacheReadCount;
+ volatile LONG MmCacheIoCount;
+ volatile LONG MmDirtyPagesWriteCount;
+ volatile LONG MmDirtyWriteIoCount;
+ volatile LONG MmMappedPagesWriteCount;
+ volatile LONG MmMappedWriteIoCount;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
ULONG CachedCommit;
ULONG CachedResidentAvailable;
ULONG MHz;
ULONG FeatureBits;
LARGE_INTEGER UpdateSignature;
- LARGE_INTEGER IsrTime;
+ volatile LARGE_INTEGER IsrTime;
LARGE_INTEGER SpareField1;
FX_SAVE_AREA NpxSaveArea;
PROCESSOR_POWER_STATE PowerState;
union
{
NT_TIB NtTib;
- struct
+ struct
{
struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
PVOID Used_StackBase;
ULONG IDR;
PVOID KdVersionBlock;
PKIDTENTRY IDT;
-#ifdef _REACTOS_
- PUSHORT GDT;
-#else
PKGDTENTRY GDT;
-#endif
struct _KTSS *TSS;
USHORT MajorVersion;
USHORT MinorVersion;
KAFFINITY SetMember;
ULONG StallScaleFactor;
- UCHAR SparedUnused;
+ UCHAR SpareUnused;
UCHAR Number;
- UCHAR Reserved;
- UCHAR L2CacheAssociativity;
+ UCHAR Spare0;
+ UCHAR SecondLevelCacheAssociativity;
ULONG VdmAlert;
ULONG KernelReserved[14];
ULONG SecondLevelCacheSize;
//
typedef struct _KiIoAccessMap
{
- UCHAR DirectionMap[32];
- UCHAR IoMap[8196];
+ UCHAR DirectionMap[IOPM_DIRECTION_MAP_SIZE];
+ UCHAR IoMap[IOPM_FULL_SIZE];
} KIIO_ACCESS_MAP;
-#include <pshpack1.h>
typedef struct _KTSS
{
USHORT Backlink;
ULONG NotUsed1[4];
ULONG CR3;
ULONG Eip;
- ULONG NotUsed2[9];
+ ULONG EFlags;
+ ULONG Eax;
+ ULONG Ecx;
+ ULONG Edx;
+ ULONG Ebx;
+ ULONG Esp;
+ ULONG Ebp;
+ ULONG Esi;
+ ULONG Edi;
USHORT Es;
USHORT Reserved2;
USHORT Cs;
USHORT Reserved8;
USHORT Flags;
USHORT IoMapBase;
- KIIO_ACCESS_MAP IoMaps[1];
- UCHAR IntDirectionMap[32];
+ KIIO_ACCESS_MAP IoMaps[IOPM_COUNT];
+ UCHAR IntDirectionMap[IOPM_DIRECTION_MAP_SIZE];
} KTSS, *PKTSS;
-#include <poppack.h>
//
// i386 CPUs don't have exception frames