[PSDK/NDK]: Fix KPCR/KIPCR for ARM to match x86 more closely. Add KeGetTickCount...
[reactos.git] / reactos / include / ndk / arm / ketypes.h
index f6379a1..feb0c16 100644 (file)
@@ -47,7 +47,7 @@ Author:
 //
 // HAL Variables
 //
-#define INITIAL_STALL_COUNT     0x64
+#define INITIAL_STALL_COUNT     100
 
 //
 // Static Kernel-Mode Address start (use MM_KSEG0_BASE for actual)
@@ -59,10 +59,6 @@ Author:
 //
 typedef struct _KTRAP_FRAME
 {
-    //    ULONG Fpscr;
-    //    ULONG FpExc;
-    //    ULONG S[33];
-    //    ULONG FpExtra[8];
     ULONG DbgArgMark;
     ULONG R0;
     ULONG R1;
@@ -85,8 +81,20 @@ typedef struct _KTRAP_FRAME
     ULONG Spsr;
     ULONG OldIrql;
     ULONG PreviousMode;
+    ULONG PreviousTrapFrame;
 } KTRAP_FRAME, *PKTRAP_FRAME;
 
+//
+// Defines the Callback Stack Layout for User Mode Callbacks
+//
+// Just a stub with some required members for now
+//
+typedef struct _KCALLOUT_FRAME
+{
+    ULONG CallbackStack;
+    ULONG DummyFramePointer;
+} KCALLOUT_FRAME, *PKCALLOUT_FRAME;
+
 #ifndef NTOS_MODE_USER
 
 //
@@ -94,6 +102,10 @@ typedef struct _KTRAP_FRAME
 //
 typedef struct _KEXCEPTION_FRAME
 {
+  //  ULONG R0;
+//    ULONG R1;
+//    ULONG R2;
+//    ULONG R3;    
     ULONG R4;
     ULONG R5;
     ULONG R6;
@@ -103,10 +115,8 @@ typedef struct _KEXCEPTION_FRAME
     ULONG R10;
     ULONG R11;
 //    ULONG R12;
-//    ULONG Sp;
-    ULONG Psr;
     ULONG Lr;
-//    ULONG SwapReturn;
+    ULONG Psr;
 } KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
 
 //
@@ -187,14 +197,22 @@ typedef union _ARM_CONTROL_REGISTER
         ULONG HighVectors:1;
         ULONG RoundRobinReplacementEnabled:1;
         ULONG Armv4Compat:1;
-        ULONG Sbo1:1;
+        ULONG Ignored:6;
+        ULONG UnalignedAccess:1;
+        ULONG ExtendedPageTables:1;
         ULONG Sbz1:1;
-        ULONG Sbo2:1;
-        ULONG Reserved:14;
+        ULONG ExceptionBit:1;
+        ULONG Sbz2:1;
+        ULONG Nmif:1;
+        ULONG TexRemap:1;
+        ULONG ForceAp:1;
+        ULONG Reserved:2;
     };
     ULONG AsUlong;
 } ARM_CONTROL_REGISTER, *PARM_CONTROL_REGISTER;
 
+C_ASSERT(sizeof(ARM_CONTROL_REGISTER) == sizeof(ULONG));
+
 typedef union _ARM_ID_CODE_REGISTER
 {
     struct
@@ -298,9 +316,13 @@ typedef struct _KPRCB
     UCHAR Reserved;
     USHORT BuildType;
     KAFFINITY SetMember;
+    UCHAR CpuType;
+    UCHAR CpuID;
+    USHORT CpuStep;
     KPROCESSOR_STATE ProcessorState;
     ULONG KernelReserved[16];
     ULONG HalReserved[16];
+    UCHAR PrcbPad0[92];
     KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock];
     struct _KTHREAD *NpxThread;
     ULONG InterruptCount;
@@ -316,7 +338,6 @@ typedef struct _KPRCB
     UCHAR NodeColor;
     UCHAR Spare1;
     ULONG NodeShiftedColor;
-    ULONG PcrPage;
     struct _KNODE *ParentNode;
     ULONG MultiThreadProcessorSet;
     struct _KPRCB *MultiThreadSetMaster;
@@ -333,6 +354,7 @@ typedef struct _KPRCB
     ULONG KeDcacheFlushCount;
     ULONG KeExceptionDispatchCount;
     ULONG KeFirstLevelTbFills;
+    ULONG KeFloatingEmulationCount;
     ULONG KeIcacheFlushCount;
     ULONG KeSecondLevelTbFills;
     ULONG KeSystemCalls;
@@ -342,18 +364,22 @@ typedef struct _KPRCB
     LARGE_INTEGER IoReadTransferCount;
     LARGE_INTEGER IoWriteTransferCount;
     LARGE_INTEGER IoOtherTransferCount;
+    ULONG SpareCounter1[8];
     PP_LOOKASIDE_LIST PPLookasideList[16];
     PP_LOOKASIDE_LIST PPNPagedLookasideList[32];
     PP_LOOKASIDE_LIST PPPagedLookasideList[32];
     volatile ULONG PacketBarrier;
     volatile ULONG ReverseStall;
     PVOID IpiFrame;
+    UCHAR PrcbPad2[52];
     volatile PVOID CurrentPacket[3];
     volatile ULONG TargetSet;
     volatile PKIPI_WORKER WorkerRoutine;
     volatile ULONG IpiFrozen;
+    UCHAR PrcbPad3[40];
     volatile ULONG RequestSummary;
     volatile struct _KPRCB *SignalDone;
+    UCHAR PrcbPad4[56];
     struct _KDPC_DATA DpcData[2];
     PVOID DpcStack;
     ULONG MaximumDpcQueueDepth;
@@ -371,15 +397,19 @@ typedef struct _KPRCB
     KEVENT DpcEvent;
     UCHAR ThreadDpcEnable;
     volatile BOOLEAN QuantumEnd;
+    UCHAR PrcbPad50;
     volatile UCHAR IdleSchedule;
     LONG DpcSetEventRequest;
+    UCHAR PrcbPad5[18];
     LONG TickOffset;
     KDPC CallDpc;
+    ULONG PrcbPad7[8];
     LIST_ENTRY WaitListHead;
     ULONG ReadySummary;
     ULONG QueueIndex;
     LIST_ENTRY DispatcherReadyListHead[32];
     SINGLE_LIST_ENTRY DeferredReadyListHead;
+    ULONG PrcbPad72[11];
     PVOID ChainedInterruptList;
     LONG LookasideIrpFloat;
     volatile LONG MmPageFaultCount;
@@ -395,13 +425,84 @@ typedef struct _KPRCB
     volatile LONG MmDirtyWriteIoCount;
     volatile LONG MmMappedPagesWriteCount;
     volatile LONG MmMappedWriteIoCount;
+    ULONG SpareFields0[1];
     CHAR VendorString[13];
+    UCHAR InitialApicId;
+    UCHAR LogicalProcessorsPerPhysicalProcessor;
     ULONG MHz;
     ULONG FeatureBits;
+    LARGE_INTEGER UpdateSignature;
     volatile LARGE_INTEGER IsrTime;
+    LARGE_INTEGER SpareField1;
+    //FX_SAVE_AREA NpxSaveArea;
     PROCESSOR_POWER_STATE PowerState;
 } KPRCB, *PKPRCB;
 
+//
+// Processor Control Region
+//
+typedef struct _KIPCR
+{
+    union
+    {
+        NT_TIB NtTib;
+        struct
+        {
+            struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; // Unused
+            PVOID Used_StackBase; // Unused
+            PVOID PerfGlobalGroupMask;
+            PVOID TssCopy; // Unused
+            ULONG ContextSwitches;
+            KAFFINITY SetMemberCopy; // Unused
+            PVOID Used_Self;
+        };
+    };
+    struct _KPCR *Self;
+    struct _KPRCB *Prcb;
+    KIRQL Irql;
+    ULONG IRR; // Unused
+    ULONG IrrActive; // Unused
+    ULONG IDR; // Unused
+    PVOID KdVersionBlock;
+    PVOID IDT; // Unused
+    PVOID GDT; // Unused
+    PVOID TSS; // Unused
+    USHORT MajorVersion;
+    USHORT MinorVersion;
+    KAFFINITY SetMember;
+    ULONG StallScaleFactor;
+    UCHAR SpareUnused;
+    UCHAR Number;
+    UCHAR Spare0;
+    UCHAR SecondLevelCacheAssociativity;
+    ULONG VdmAlert;
+    ULONG KernelReserved[14];
+    ULONG SecondLevelCacheSize;
+    ULONG HalReserved[16];  
+    // arm part
+    UCHAR IrqlMask[32];
+    ULONG IrqlTable[32];
+    PKINTERRUPT_ROUTINE InterruptRoutine[32];
+    ULONG ReservedVectors;
+    ULONG FirstLevelDcacheSize;
+    ULONG FirstLevelDcacheFillSize;
+    ULONG FirstLevelIcacheSize;
+    ULONG FirstLevelIcacheFillSize;
+    ULONG SecondLevelDcacheSize;
+    ULONG SecondLevelDcacheFillSize;
+    ULONG SecondLevelIcacheSize;
+    ULONG SecondLevelIcacheFillSize;
+    ULONG DcacheFillSize;
+    ULONG DcacheAlignment;
+    ULONG IcacheAlignment;
+    ULONG IcacheFillSize;
+    ULONG ProcessorId;
+    PVOID InterruptStack;
+    PVOID PanicStack;
+    PVOID InitialStack;
+    KPRCB PrcbData;
+} KIPCR, *PKIPCR;
+
 //
 // Macro to get current KPRCB
 //
@@ -412,5 +513,17 @@ KeGetCurrentPrcb(VOID)
     return PCR->Prcb;
 }
 
+//
+// Just read it from the PCR
+//
+#define KeGetCurrentProcessorNumber()  (int)PCR->Number
+#define KeGetCurrentIrql()             PCR->Irql
+#define _KeGetCurrentThread()          KeGetCurrentPrcb()->CurrentThread
+#define _KeGetPreviousMode()           KeGetCurrentPrcb()->CurrentThread->PreviousMode
+#define _KeIsExecutingDpc()            (KeGetCurrentPrcb()->DpcRoutineActive != 0)
+#define KeGetCurrentThread()           _KeGetCurrentThread()
+#define KeGetPreviousMode()            _KeGetPreviousMode()
+#define KeGetDcacheFillSize()          PCR->DcacheFillSize
+
 #endif
 #endif