Sync to trunk head(r38096)
[reactos.git] / reactos / ntoskrnl / include / internal / ke.h
index eb14eca..cf60cd2 100644 (file)
@@ -18,18 +18,6 @@ typedef struct _KPROFILE_SOURCE_OBJECT
     LIST_ENTRY ListEntry;
 } KPROFILE_SOURCE_OBJECT, *PKPROFILE_SOURCE_OBJECT;
 
-/* Cached modules from the loader block */
-typedef enum _CACHED_MODULE_TYPE
-{
-    AnsiCodepage,
-    OemCodepage,
-    UnicodeCasemap,
-    SystemRegistry,
-    HardwareRegistry,
-    MaximumCachedModuleType,
-} CACHED_MODULE_TYPE, *PCACHED_MODULE_TYPE;
-extern PLOADER_MODULE CachedModules[MaximumCachedModuleType];
-
 typedef enum _CONNECT_TYPE
 {
     NoConnect,
@@ -49,12 +37,33 @@ typedef struct _DISPATCH_INFO
     PKINTERRUPT_ROUTINE *FlatDispatch;
 } DISPATCH_INFO, *PDISPATCH_INFO;
 
+typedef struct _KI_SAMPLE_MAP
+{
+    LARGE_INTEGER PerfStart;
+    LARGE_INTEGER PerfEnd;
+    LONGLONG PerfDelta;
+    LARGE_INTEGER PerfFreq;
+    LONGLONG TSCStart;
+    LONGLONG TSCEnd;
+    LONGLONG TSCDelta;
+    ULONG MHz;
+} KI_SAMPLE_MAP, *PKI_SAMPLE_MAP;
+
 typedef struct _KTIMER_TABLE_ENTRY
 {
     LIST_ENTRY Entry;
     ULARGE_INTEGER Time;
 } KTIMER_TABLE_ENTRY, *PKTIMER_TABLE_ENTRY;
 
+#define MAX_TIMER_DPCS                      16
+
+typedef struct _DPC_QUEUE_ENTRY
+{
+    PKDPC Dpc;
+    PKDEFERRED_ROUTINE Routine;
+    PVOID Context;
+} DPC_QUEUE_ENTRY, *PDPC_QUEUE_ENTRY;
+
 typedef PCHAR
 (NTAPI *PKE_BUGCHECK_UNICODE_TO_ANSI)(
     IN PUNICODE_STRING Unicode,
@@ -62,20 +71,21 @@ typedef PCHAR
     IN ULONG Length
 );
 
-struct _KIRQ_TRAPFRAME;
-struct _KPCR;
-struct _KPRCB;
-struct _KEXCEPTION_FRAME;
+extern ULONG_PTR MmFreeLdrFirstKrnlPhysAddr;
+extern ULONG_PTR MmFreeLdrLastKrnlPhysAddr;
+extern ULONG_PTR MmFreeLdrLastKernelAddress;
 
 extern PVOID KeUserApcDispatcher;
 extern PVOID KeUserCallbackDispatcher;
 extern PVOID KeUserExceptionDispatcher;
 extern PVOID KeRaiseUserExceptionDispatcher;
-extern LARGE_INTEGER SystemBootTime;
-extern ULONG_PTR KERNEL_BASE;
+extern LARGE_INTEGER KeBootTime;
+extern ULONGLONG KeBootTimeBias;
+extern BOOLEAN ExCmosClockIsSane;
 extern ULONG KeI386NpxPresent;
 extern ULONG KeI386XMMIPresent;
 extern ULONG KeI386FxsrPresent;
+extern ULONG KiMXCsrMask;
 extern ULONG KeI386CpuType;
 extern ULONG KeI386CpuStep;
 extern ULONG KeProcessorArchitecture;
@@ -83,6 +93,7 @@ extern ULONG KeProcessorLevel;
 extern ULONG KeProcessorRevision;
 extern ULONG KeFeatureBits;
 extern ULONG Ke386GlobalPagesEnabled;
+extern BOOLEAN KiI386PentiumLockErrataPresent;
 extern KNODE KiNode0;
 extern PKNODE KeNodeBlock[1];
 extern UCHAR KeNumberNodes;
@@ -94,6 +105,7 @@ extern PULONG KiInterruptTemplateObject;
 extern PULONG KiInterruptTemplateDispatch;
 extern PULONG KiInterruptTemplate2ndDispatch;
 extern ULONG KiUnexpectedEntrySize;
+#if defined(_M_IX86) || defined(_M_AMD64)
 extern PVOID Ki386IopmSaveArea;
 extern ULONG KeI386EFlagsAndMaskV86;
 extern ULONG KeI386EFlagsOrMaskV86;
@@ -103,21 +115,24 @@ extern KGDTENTRY KiBootGdt[];
 extern KDESCRIPTOR KiGdtDescriptor;
 extern KDESCRIPTOR KiIdtDescriptor;
 extern KTSS KiBootTss;
+#endif
 extern UCHAR P0BootStack[];
 extern UCHAR KiDoubleFaultStack[];
-extern FAST_MUTEX KernelAddressSpaceLock;
+extern EX_PUSH_LOCK KernelAddressSpaceLock;
 extern ULONG KiMaximumDpcQueueDepth;
 extern ULONG KiMinimumDpcRate;
 extern ULONG KiAdjustDpcThreshold;
 extern ULONG KiIdealDpcRate;
+extern BOOLEAN KeThreadDpcEnable;
 extern LARGE_INTEGER KiTimeIncrementReciprocal;
 extern UCHAR KiTimeIncrementShiftCount;
-extern LIST_ENTRY BugcheckCallbackListHead, BugcheckReasonCallbackListHead;
+extern ULONG KiTimeLimitIsrMicroseconds;
+extern ULONG KiServiceLimit;
+extern LIST_ENTRY KeBugcheckCallbackListHead, KeBugcheckReasonCallbackListHead;
 extern KSPIN_LOCK BugCheckCallbackLock;
-extern KDPC KiExpireTimerDpc;
+extern KDPC KiTimerExpireDpc;
 extern KTIMER_TABLE_ENTRY KiTimerTableListHead[TIMER_TABLE_SIZE];
-extern LIST_ENTRY KiTimerListHead;
-extern KMUTEX KiGenericCallDpcMutex;
+extern FAST_MUTEX KiGenericCallDpcMutex;
 extern LIST_ENTRY KiProfileListHead, KiProfileSourceListHead;
 extern KSPIN_LOCK KiProfileLock;
 extern LIST_ENTRY KiProcessListHead;
@@ -127,8 +142,20 @@ extern KEVENT KiSwapEvent;
 extern PKPRCB KiProcessorBlock[];
 extern ULONG KiMask32Array[MAXIMUM_PRIORITY];
 extern ULONG KiIdleSummary;
-extern VOID KiTrap8(VOID);
-extern VOID KiTrap2(VOID);
+extern VOID __cdecl KiTrap19(VOID);
+extern VOID __cdecl KiTrap8(VOID);
+extern VOID __cdecl KiTrap2(VOID);
+extern VOID __cdecl KiFastCallEntry(VOID);
+extern PVOID KeUserApcDispatcher;
+extern PVOID KeUserCallbackDispatcher;
+extern PVOID KeUserExceptionDispatcher;
+extern PVOID KeRaiseUserExceptionDispatcher;
+extern UCHAR KiDebugRegisterTrapOffsets[9];
+extern UCHAR KiDebugRegisterContextOffsets[9];
+extern ULONG KeTimeIncrement;
+extern ULONG_PTR KiBugCheckData[5];
+extern ULONG KiFreezeFlag;
+extern ULONG KiDPCTimeout;
 
 /* MACROS *************************************************************************/
 
@@ -146,10 +173,6 @@ extern VOID KiTrap2(VOID);
     InitializeListHead(&((Header)->WaitListHead));                          \
 }
 
-#define KEBUGCHECKWITHTF(a,b,c,d,e,f) \
-    DbgPrint("KeBugCheckWithTf at %s:%i\n",__FILE__,__LINE__), \
-             KeBugCheckWithTf(a,b,c,d,e,f)
-
 /* Tells us if the Timer or Event is a Syncronization or Notification Object */
 #define TIMER_OR_EVENT_TYPE 0x7L
 
@@ -168,32 +191,43 @@ extern VOID KiTrap2(VOID);
 
 /* INTERNAL KERNEL FUNCTIONS ************************************************/
 
-/* Readies a Thread for Execution. */
-BOOLEAN
-NTAPI
-KiDispatchThreadNoLock(ULONG NewThreadStatus);
-
-/* Readies a Thread for Execution. */
-VOID
-NTAPI
-KiDispatchThread(ULONG NewThreadStatus);
-
 /* Finds a new thread to run */
-NTSTATUS
+LONG_PTR
 FASTCALL
 KiSwapThread(
     IN PKTHREAD Thread,
     IN PKPRCB Prcb
 );
 
+VOID
+NTAPI
+KeReadyThread(
+    IN PKTHREAD Thread
+);
+
+BOOLEAN
+NTAPI
+KeSetDisableBoostThread(
+    IN OUT PKTHREAD Thread,
+    IN BOOLEAN Disable
+);
+
+VOID
+NTAPI
+KeBalanceSetManager(IN PVOID Context);
+
 VOID
 NTAPI
 KiReadyThread(IN PKTHREAD Thread);
 
-NTSTATUS
+ULONG
 NTAPI
 KeSuspendThread(PKTHREAD Thread);
 
+BOOLEAN
+NTAPI
+KeReadStateThread(IN PKTHREAD Thread);
+
 BOOLEAN
 FASTCALL
 KiSwapContext(
@@ -213,20 +247,66 @@ VOID
 NTAPI
 KiDeferredReadyThread(IN PKTHREAD Thread);
 
+PKTHREAD
+FASTCALL
+KiIdleSchedule(
+    IN PKPRCB Prcb
+);
+
+VOID
+FASTCALL
+KiProcessDeferredReadyList(
+    IN PKPRCB Prcb
+);
+
 KAFFINITY
-NTAPI
+FASTCALL
 KiSetAffinityThread(
     IN PKTHREAD Thread,
-    IN KAFFINITY Affinity,
-    IN PBOOLEAN Released // hack
+    IN KAFFINITY Affinity
 );
 
 PKTHREAD
-NTAPI
+FASTCALL
 KiSelectNextThread(
     IN PKPRCB Prcb
 );
 
+VOID
+NTAPI
+CPUID(
+    OUT ULONG CpuInfo[4],
+    IN ULONG InfoType
+);
+
+BOOLEAN
+FASTCALL
+KiInsertTimerTable(
+    IN PKTIMER Timer,
+    IN ULONG Hand
+);
+
+VOID
+FASTCALL
+KiTimerListExpire(
+    IN PLIST_ENTRY ExpiredListHead,
+    IN KIRQL OldIrql
+);
+
+BOOLEAN
+FASTCALL
+KiInsertTreeTimer(
+    IN PKTIMER Timer,
+    IN LARGE_INTEGER Interval
+);
+
+VOID
+FASTCALL
+KiCompleteTimer(
+    IN PKTIMER Timer,
+    IN PKSPIN_LOCK_QUEUE LockQueue
+);
+
 /* gmutex.c ********************************************************************/
 
 VOID
@@ -254,12 +334,35 @@ KeWaitForGate(
 /* ipi.c ********************************************************************/
 
 VOID
-NTAPI
-KiIpiSendRequest(
+FASTCALL
+KiIpiSend(
     KAFFINITY TargetSet,
     ULONG IpiRequest
 );
 
+VOID
+NTAPI
+KiIpiSendPacket(
+    IN KAFFINITY TargetProcessors,
+    IN PKIPI_WORKER WorkerFunction,
+    IN PKIPI_BROADCAST_WORKER BroadcastFunction,
+    IN ULONG_PTR Context,
+    IN PULONG Count
+);
+
+VOID
+FASTCALL
+KiIpiSignalPacketDone(
+    IN PKIPI_CONTEXT PacketContext
+);
+
+VOID
+FASTCALL
+KiIpiSignalPacketDoneAndStall(
+    IN PKIPI_CONTEXT PacketContext,
+    IN volatile PULONG ReverseStall
+);
+
 /* next file ***************************************************************/
 
 UCHAR
@@ -269,7 +372,7 @@ KeFindNextRightSetAffinity(
     IN ULONG Set
 );
 
-VOID 
+VOID
 NTAPI
 DbgBreakPointNoBugCheck(VOID);
 
@@ -320,10 +423,6 @@ KeProfileInterruptWithSource(
     IN KPROFILE_SOURCE Source
 );
 
-BOOLEAN
-NTAPI
-KiRosPrintAddress(PVOID Address);
-
 VOID
 NTAPI
 KeUpdateRunTime(
@@ -441,27 +540,17 @@ NTAPI
 KeQueryBasePriorityThread(IN PKTHREAD Thread);
 
 VOID
-NTAPI
+FASTCALL
 KiSetPriorityThread(
     IN PKTHREAD Thread,
-    IN KPRIORITY Priority,
-    IN PBOOLEAN Released // hack
-);
-
-BOOLEAN
-NTAPI
-KiDispatcherObjectWake(
-    DISPATCHER_HEADER* hdr,
-    KPRIORITY increment
+    IN KPRIORITY Priority
 );
 
 VOID
-NTAPI
-KeExpireTimers(
-    PKDPC Apc,
-    PVOID Arg1,
-    PVOID Arg2,
-    PVOID Arg3
+FASTCALL
+KiUnlinkThread(
+    IN PKTHREAD Thread,
+    IN NTSTATUS WaitStatus
 );
 
 VOID
@@ -474,9 +563,9 @@ KiTestAlert(VOID);
 
 VOID
 FASTCALL
-KiAbortWaitThread(
+KiUnwaitThread(
     IN PKTHREAD Thread,
-    IN NTSTATUS WaitStatus,
+    IN LONG_PTR WaitStatus,
     IN KPRIORITY Increment
 );
 
@@ -486,7 +575,7 @@ KeInitializeProcess(
     struct _KPROCESS *Process,
     KPRIORITY Priority,
     KAFFINITY Affinity,
-    PLARGE_INTEGER DirectoryTableBase,
+    PULONG DirectoryTableBase,
     IN BOOLEAN Enable
 );
 
@@ -509,17 +598,22 @@ ULONG
 NTAPI
 KeForceResumeThread(IN PKTHREAD Thread);
 
-BOOLEAN
+VOID
 NTAPI
-KeDisableThreadApcQueueing(IN PKTHREAD Thread);
+KeThawAllThreads(
+    VOID
+);
 
-BOOLEAN
+VOID
 NTAPI
-KiInsertTimer(
-    PKTIMER Timer,
-    LARGE_INTEGER DueTime
+KeFreezeAllThreads(
+    VOID
 );
 
+BOOLEAN
+NTAPI
+KeDisableThreadApcQueueing(IN PKTHREAD Thread);
+
 VOID
 FASTCALL
 KiWaitTest(
@@ -527,10 +621,6 @@ KiWaitTest(
     KPRIORITY Increment
 );
 
-PULONG 
-NTAPI
-KeGetStackTopThread(struct _ETHREAD* Thread);
-
 VOID
 NTAPI
 KeContextToTrapFrame(
@@ -553,6 +643,21 @@ KiInsertQueue(
     BOOLEAN Head
 );
 
+VOID
+NTAPI
+KiTimerExpiration(
+    IN PKDPC Dpc,
+    IN PVOID DeferredContext,
+    IN PVOID SystemArgument1,
+    IN PVOID SystemArgument2
+);
+
+ULONG
+NTAPI
+KiComputeTimerTableIndex(
+    IN LONGLONG TimeValue
+);
+
 ULONG
 NTAPI
 KeSetProcess(
@@ -609,29 +714,26 @@ KeRemoveQueueApc(PKAPC Apc);
 
 VOID
 FASTCALL
-KiWakeQueue(IN PKQUEUE Queue);
-
-/* INITIALIZATION FUNCTIONS *************************************************/
+KiActivateWaiterQueue(IN PKQUEUE Queue);
 
-VOID
+ULONG
 NTAPI
-KeInitExceptions(VOID);
+KeQueryRuntimeProcess(IN PKPROCESS Process,
+                      OUT PULONG UserTime);
 
-VOID
-NTAPI
-KeInitInterrupts(VOID);
+/* INITIALIZATION FUNCTIONS *************************************************/
 
-VOID
+BOOLEAN
 NTAPI
-KeInitTimer(VOID);
+KeInitSystem(VOID);
 
 VOID
 NTAPI
-KeInitDispatcher(VOID);
+KeInitExceptions(VOID);
 
 VOID
 NTAPI
-KiInitializeSystemClock(VOID);
+KeInitInterrupts(VOID);
 
 VOID
 NTAPI
@@ -639,18 +741,10 @@ KiInitializeBugCheck(VOID);
 
 VOID
 NTAPI
-Phase1Initialization(PVOID Context);
-
-VOID
-NTAPI
-KiSystemStartup(
-    IN PROS_LOADER_PARAMETER_BLOCK LoaderBlock
+KiSystemStartupReal(
+    IN PLOADER_PARAMETER_BLOCK LoaderBlock
 );
 
-VOID
-NTAPI
-KeInit2(VOID);
-
 BOOLEAN
 NTAPI
 KiDeliverUserApc(PKTRAP_FRAME TrapFrame);
@@ -689,56 +783,47 @@ KeTrapFrameToContext(
 
 VOID
 NTAPI
-KeApplicationProcessorInit(VOID);
-
-VOID
-NTAPI
-KePrepareForApplicationProcessorInit(ULONG id);
-
-ULONG
-NTAPI
-KiUserTrapHandler(
-    PKTRAP_FRAME Tf,
-    ULONG ExceptionNr,
-    PVOID Cr2
+KeBugCheckWithTf(
+    ULONG BugCheckCode,
+    ULONG_PTR BugCheckParameter1,
+    ULONG_PTR BugCheckParameter2,
+    ULONG_PTR BugCheckParameter3,
+    ULONG_PTR BugCheckParameter4,
+    PKTRAP_FRAME Tf
 );
 
 VOID
 NTAPI
-KePushAndStackSwitchAndSysRet(
-    ULONG Push,
-    PVOID NewStack
-);
+KeFlushCurrentTb(VOID);
 
-VOID
+BOOLEAN
 NTAPI
-KeStackSwitchAndRet(PVOID NewStack);
+KeInvalidateAllCaches(VOID);
 
 VOID
-NTAPI
-KeBugCheckWithTf(
-    ULONG BugCheckCode,
-    ULONG BugCheckParameter1,
-    ULONG BugCheckParameter2,
-    ULONG BugCheckParameter3,
-    ULONG BugCheckParameter4,
-    PKTRAP_FRAME Tf
-);
+FASTCALL
+KeZeroPages(IN PVOID Address,
+            IN ULONG Size);
 
-VOID
-NTAPI
-KeFlushCurrentTb(VOID);
+BOOLEAN
+FASTCALL
+KeInvalidAccessAllowed(IN PVOID TrapInformation OPTIONAL);
 
 VOID
 NTAPI
 KeRosDumpStackFrames(
-    PULONG Frame,
+    PULONG_PTR Frame,
     ULONG FrameCount
 );
 
 VOID
 NTAPI
-KiSetSystemTime(PLARGE_INTEGER NewSystemTime);
+KeSetSystemTime(
+    IN PLARGE_INTEGER NewSystemTime,
+    OUT PLARGE_INTEGER OldSystemTime,
+    IN BOOLEAN FixInterruptTime,
+    IN PLARGE_INTEGER HalTime
+);
 
 ULONG
 NTAPI
@@ -790,11 +875,33 @@ KeI386VdmInitialize(
     VOID
 );
 
+VOID
+NTAPI
+KiInitializeMachineType(
+    VOID
+);
+
+//
+// We need to do major portability work
+//
+#ifdef _M_IX86
 VOID
 NTAPI
 KiFlushNPXState(
     IN FLOATING_SAVE_AREA *SaveArea
 );
+#endif
+
+VOID
+NTAPI
+KiSetupStackAndInitializeKernel(
+    IN PKPROCESS InitProcess,
+    IN PKTHREAD InitThread,
+    IN PVOID IdleStack,
+    IN PKPRCB Prcb,
+    IN CCHAR Number,
+    IN PLOADER_PARAMETER_BLOCK LoaderBlock
+);
 
 VOID
 NTAPI
@@ -823,6 +930,140 @@ KiInsertQueueApc(
     IN KPRIORITY PriorityBoost
 );
 
+NTSTATUS
+NTAPI
+KiCallUserMode(
+    IN PVOID *OutputBuffer,
+    IN PULONG OutputLength
+);
+
+PULONG
+NTAPI
+KiGetUserModeStackAddress(
+    VOID
+);
+
+ULONG_PTR
+NTAPI
+Ki386EnableGlobalPage(IN volatile ULONG_PTR Context);
+
+VOID
+NTAPI
+KiInitializePAT(VOID);
+
+VOID
+NTAPI
+KiInitializeMTRR(IN BOOLEAN FinalCpu);
+
+VOID
+NTAPI
+KiAmdK6InitializeMTRR(VOID);
+
+VOID
+NTAPI
+KiRestoreFastSyscallReturnState(VOID);
+
+ULONG_PTR
+NTAPI
+Ki386EnableDE(IN ULONG_PTR Context);
+
+ULONG_PTR
+NTAPI
+Ki386EnableFxsr(IN ULONG_PTR Context);
+
+ULONG_PTR
+NTAPI
+Ki386EnableXMMIExceptions(IN ULONG_PTR Context);
+
+VOID
+NTAPI
+KiInitMachineDependent(VOID);
+
+VOID
+NTAPI
+KiI386PentiumLockErrataFixup(VOID);
+
+VOID
+WRMSR(
+    IN ULONG Register,
+    IN LONGLONG Value
+);
+
+BOOLEAN
+NTAPI
+KeFreezeExecution(IN PKTRAP_FRAME TrapFrame,
+                  IN PKEXCEPTION_FRAME ExceptionFrame);
+
+VOID
+NTAPI
+KeThawExecution(IN BOOLEAN Enable);
+
+BOOLEAN
+NTAPI
+KeDisableInterrupts(
+    VOID
+);
+
+VOID
+FASTCALL
+KeAcquireQueuedSpinLockAtDpcLevel(
+    IN OUT PKSPIN_LOCK_QUEUE LockQueue
+);
+
+VOID
+FASTCALL
+KeReleaseQueuedSpinLockFromDpcLevel(
+    IN OUT PKSPIN_LOCK_QUEUE LockQueue
+);
+
+VOID
+NTAPI
+KiRestoreProcessorControlState(
+    IN PKPROCESSOR_STATE ProcessorState
+);
+
+VOID
+NTAPI
+KiSaveProcessorControlState(
+    OUT PKPROCESSOR_STATE ProcessorState
+);
+
+VOID
+FASTCALL
+KiRetireDpcList(
+    IN PKPRCB Prcb
+);
+
+VOID
+NTAPI
+KiQuantumEnd(
+    VOID
+);
+
+VOID
+KiSystemService(
+    IN PKTHREAD Thread,
+    IN PKTRAP_FRAME TrapFrame,
+    IN ULONG Instruction
+);
+
+VOID
+KiIdleLoop(
+    VOID
+);
+
+PVOID
+NTAPI
+KiPcToFileHeader(IN PVOID Eip,
+                 OUT PLDR_DATA_TABLE_ENTRY *LdrEntry,
+                 IN BOOLEAN DriversOnly,
+                 OUT PBOOLEAN InKernel);
+
+PVOID
+NTAPI
+KiRosPcToUserFileHeader(IN PVOID Eip,
+                        OUT PLDR_DATA_TABLE_ENTRY *LdrEntry);
+
 #include "ke_x.h"
 
 #endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */