// Dependencies
//
+//
+// KPCR Access for non-IA64 builds
+//
+#define K0IPCR ((ULONG_PTR)(KIP0PCRADDRESS))
+#define PCR ((volatile KPCR * const)K0IPCR)
+#if defined(CONFIG_SMP) || defined(NT_BUILD)
+#undef KeGetPcr
+#define KeGetPcr() ((volatile KPCR * const)__readfsdword(0x1C))
+#endif
+
//
// Machine Types
//
#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
#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
//
-// Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
+// IOPM Definitions
//
-#define KSEG0_BASE 0x80000000
+#define IO_ACCESS_MAP_NONE 0
+#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))
//
-// Macro to get current KPRCB
+// Size of the XMM register save area in the FXSAVE format
//
-#ifndef __GNUC__ // fixme
-FORCEINLINE
-struct _KPRCB *
-KeGetCurrentPrcb(VOID)
-{
- return (struct _KPRCB *)(ULONG_PTR)__readfsdword(FIELD_OFFSET(KPCR, Prcb));
-}
+#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 previous mode
+// Synchronization-level IRQL
//
-#define KeGetPreviousMode ExGetPreviousMode
+#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
//
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;
#else
ULONG SpareFields0[1];
#endif
- CHAR VendorString[13];
+ UCHAR VendorString[13];
UCHAR InitialApicId;
UCHAR LogicalProcessorsPerPhysicalProcessor;
ULONG MHz;
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;