[HEADERS]
[reactos.git] / reactos / include / ndk / i386 / ketypes.h
index df4d7b4..f90a39e 100644 (file)
@@ -23,6 +23,16 @@ Author:
 // 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
 //
@@ -56,6 +66,11 @@ Author:
 #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
 //
@@ -78,15 +93,29 @@ Author:
 #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
 //
@@ -96,10 +125,36 @@ Author:
 #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     0x64
+#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)
@@ -107,11 +162,16 @@ Author:
 #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
 
 //
@@ -156,6 +216,23 @@ typedef struct _KTRAP_FRAME
     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
 //
@@ -253,16 +330,23 @@ typedef struct _KIDTENTRY
     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
@@ -291,7 +375,7 @@ typedef struct _FXSAVE_FORMAT
     ULONG DataSelector;
     ULONG MXCsr;
     ULONG MXCsrMask;
-    UCHAR RegisterArea[128];
+    UCHAR RegisterArea[SIZE_OF_FX_REGISTERS];
     UCHAR Reserved3[128];
     UCHAR Reserved4[224];
     UCHAR Align16Byte[8];
@@ -333,7 +417,6 @@ typedef struct _KSPECIAL_REGISTERS
 //
 // Processor State Data
 //
-#pragma pack(push,4)
 typedef struct _KPROCESSOR_STATE
 {
     CONTEXT ContextFrame;
@@ -343,6 +426,7 @@ typedef struct _KPROCESSOR_STATE
 //
 // Processor Region Control Block
 //
+#pragma pack(push,4)
 typedef struct _KPRCB
 {
     USHORT MinorVersion;
@@ -421,9 +505,9 @@ typedef struct _KPRCB
     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;
@@ -464,37 +548,37 @@ typedef struct _KPRCB
     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;
@@ -535,19 +619,19 @@ typedef struct _KPRCB
 #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;
@@ -563,7 +647,7 @@ typedef struct _KPRCB
     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;
@@ -594,7 +678,7 @@ typedef struct _KIPCR
     union
     {
         NT_TIB NtTib;
-        struct 
+        struct
         {
             struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
             PVOID Used_StackBase;
@@ -613,20 +697,16 @@ typedef struct _KIPCR
     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;
@@ -643,11 +723,10 @@ typedef struct _KIPCR
 //
 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;
@@ -658,7 +737,15 @@ typedef struct _KTSS
     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;
@@ -675,10 +762,9 @@ typedef struct _KTSS
     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