ReactOS 0.4.16-dev-822-gbcedb53
krnlinit.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/ke/krnlinit.c
5 * PURPOSE: Portable part of kernel initialization
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9/* INCLUDES ******************************************************************/
10
11#include <ntoskrnl.h>
12#define NDEBUG
13#include <debug.h>
14#include <internal/napi.h>
15
16/* GLOBALS *******************************************************************/
17
18/* Portable CPU Features and Flags */
23
24/* System call count */
26
27/* ARC Loader Block */
29
30/* PRCB Array */
32
33/* NUMA Node Support */
38
39/* Initial Process and Thread */
42
43/* System-defined Spinlocks */
61
62/* FUNCTIONS *****************************************************************/
63
64CODE_SEG("INIT")
65VOID
68{
69 ULONG i;
70
71 /* Initialize Bugcheck Callback data */
75
76 /* Initialize the Timer Expiration DPC */
79
80 /* Initialize Profiling data */
84
85 /* Loop the timer table */
86 for (i = 0; i < TIMER_TABLE_SIZE; i++)
87 {
88 /* Initialize the list and entries */
90 KiTimerTableListHead[i].Time.HighPart = 0xFFFFFFFF;
92 }
93
94 /* Initialize the Swap event and all swap lists */
99
100 /* Initialize the mutex for generic DPC calls */
102
103 /* Initialize the syscall table */
109
110 /* Copy the the current table into the shadow table for win32k */
114}
115
116CODE_SEG("INIT")
118NTAPI
121{
122 LARGE_INTEGER Reciprocal = {{0, 0}};
123 LONG BitCount = 0, Remainder = 1;
124
125 /* Start by calculating the remainder */
126 while (Reciprocal.HighPart >= 0)
127 {
128 /* Increase the loop (bit) count */
129 BitCount++;
130
131 /* Calculate the current fraction */
132 Reciprocal.HighPart = (Reciprocal.HighPart << 1) |
133 (Reciprocal.LowPart >> 31);
134 Reciprocal.LowPart <<= 1;
135
136 /* Double the remainder and see if we went past the divisor */
137 Remainder <<= 1;
138 if (Remainder >= Divisor)
139 {
140 /* Set the low-bit and calculate the new remainder */
142 Reciprocal.LowPart |= 1;
143 }
144 }
145
146 /* Check if we have a remainder */
147 if (Remainder)
148 {
149 /* Check if the current fraction value is too large */
150 if ((Reciprocal.LowPart == 0xFFFFFFFF) &&
151 (Reciprocal.HighPart == (LONG)0xFFFFFFFF))
152 {
153 /* Set the high bit and reduce the bit count */
154 Reciprocal.LowPart = 0;
155 Reciprocal.HighPart = 0x80000000;
156 BitCount--;
157 }
158 else
159 {
160 /* Check if only the lowest bits got too large */
161 if (Reciprocal.LowPart == 0xFFFFFFFF)
162 {
163 /* Reset them and increase the high bits instead */
164 Reciprocal.LowPart = 0;
165 Reciprocal.HighPart++;
166 }
167 else
168 {
169 /* All is well, increase the low bits */
170 Reciprocal.LowPart++;
171 }
172 }
173 }
174
175 /* Now calculate the actual shift and return the reciprocal */
176 *Shift = (UCHAR)BitCount - 64;
177 return Reciprocal;
178}
179
180CODE_SEG("INIT")
181VOID
182NTAPI
185{
186 ULONG i;
187
188 /* Initialize Dispatcher Fields */
189 Prcb->QueueIndex = 1;
190 Prcb->ReadySummary = 0;
191 Prcb->DeferredReadyListHead.Next = NULL;
192 for (i = 0; i < MAXIMUM_PRIORITY; i++)
193 {
194 /* Initialize the ready list */
195 InitializeListHead(&Prcb->DispatcherReadyListHead[i]);
196 }
197
198 /* Initialize DPC Fields */
199 InitializeListHead(&Prcb->DpcData[DPC_NORMAL].DpcListHead);
200 KeInitializeSpinLock(&Prcb->DpcData[DPC_NORMAL].DpcLock);
201 Prcb->DpcData[DPC_NORMAL].DpcQueueDepth = 0;
202 Prcb->DpcData[DPC_NORMAL].DpcCount = 0;
203 Prcb->DpcRoutineActive = FALSE;
204 Prcb->MaximumDpcQueueDepth = KiMaximumDpcQueueDepth;
205 Prcb->MinimumDpcRate = KiMinimumDpcRate;
206 Prcb->AdjustDpcThreshold = KiAdjustDpcThreshold;
207 KeInitializeDpc(&Prcb->CallDpc, NULL, NULL);
208 KeSetTargetProcessorDpc(&Prcb->CallDpc, Number);
209 KeSetImportanceDpc(&Prcb->CallDpc, HighImportance);
210
211 /* Initialize the Wait List Head */
212 InitializeListHead(&Prcb->WaitListHead);
213
214 /* Initialize Queued Spinlocks */
215 Prcb->LockQueue[LockQueueDispatcherLock].Next = NULL;
216 Prcb->LockQueue[LockQueueDispatcherLock].Lock = &KiDispatcherLock;
217 Prcb->LockQueue[LockQueueExpansionLock].Next = NULL;
218 Prcb->LockQueue[LockQueueExpansionLock].Lock = NULL;
219 Prcb->LockQueue[LockQueuePfnLock].Next = NULL;
220 Prcb->LockQueue[LockQueuePfnLock].Lock = &MmPfnLock;
221 Prcb->LockQueue[LockQueueSystemSpaceLock].Next = NULL;
222 Prcb->LockQueue[LockQueueSystemSpaceLock].Lock = &MmSystemSpaceLock;
223 Prcb->LockQueue[LockQueueBcbLock].Next = NULL;
224 Prcb->LockQueue[LockQueueBcbLock].Lock = &CcBcbSpinLock;
225 Prcb->LockQueue[LockQueueMasterLock].Next = NULL;
226 Prcb->LockQueue[LockQueueMasterLock].Lock = &CcMasterSpinLock;
227 Prcb->LockQueue[LockQueueVacbLock].Next = NULL;
228 Prcb->LockQueue[LockQueueVacbLock].Lock = &CcVacbSpinLock;
229 Prcb->LockQueue[LockQueueWorkQueueLock].Next = NULL;
230 Prcb->LockQueue[LockQueueWorkQueueLock].Lock = &CcWorkQueueSpinLock;
231 Prcb->LockQueue[LockQueueNonPagedPoolLock].Next = NULL;
232 Prcb->LockQueue[LockQueueNonPagedPoolLock].Lock = &NonPagedPoolLock;
233 Prcb->LockQueue[LockQueueMmNonPagedPoolLock].Next = NULL;
234 Prcb->LockQueue[LockQueueMmNonPagedPoolLock].Lock = &MmNonPagedPoolLock;
235 Prcb->LockQueue[LockQueueIoCancelLock].Next = NULL;
236 Prcb->LockQueue[LockQueueIoCancelLock].Lock = &IopCancelSpinLock;
237 Prcb->LockQueue[LockQueueIoVpbLock].Next = NULL;
238 Prcb->LockQueue[LockQueueIoVpbLock].Lock = &IopVpbSpinLock;
239 Prcb->LockQueue[LockQueueIoDatabaseLock].Next = NULL;
240 Prcb->LockQueue[LockQueueIoDatabaseLock].Lock = &IopDatabaseLock;
241 Prcb->LockQueue[LockQueueIoCompletionLock].Next = NULL;
242 Prcb->LockQueue[LockQueueIoCompletionLock].Lock = &IopCompletionLock;
243 Prcb->LockQueue[LockQueueNtfsStructLock].Next = NULL;
244 Prcb->LockQueue[LockQueueNtfsStructLock].Lock = &NtfsStructLock;
245 Prcb->LockQueue[LockQueueAfdWorkQueueLock].Next = NULL;
246 Prcb->LockQueue[LockQueueAfdWorkQueueLock].Lock = &AfdWorkQueueSpinLock;
247 Prcb->LockQueue[LockQueueUnusedSpare16].Next = NULL;
248 Prcb->LockQueue[LockQueueUnusedSpare16].Lock = NULL;
249
250 /* Loop timer locks (shared amongst all CPUs) */
251 for (i = 0; i < LOCK_QUEUE_TIMER_TABLE_LOCKS; i++)
252 {
253 /* Setup the Queued Spinlock (done only once by the boot CPU) */
254 if (!Number)
256
257 /* Initialize the lock */
258 Prcb->LockQueue[LockQueueTimerTableLock + i].Next = NULL;
259 Prcb->LockQueue[LockQueueTimerTableLock + i].Lock =
261 }
262
263 /* Initialize the PRCB lock */
264 KeInitializeSpinLock(&Prcb->PrcbLock);
265
266 /* Check if this is the boot CPU */
267 if (!Number)
268 {
269 /* Initialize the lock themselves */
286 }
287}
288
289CODE_SEG("INIT")
291NTAPI
293{
294 /* Check if Threaded DPCs are enabled */
296 {
297 /* FIXME: TODO */
298 DPRINT1("Threaded DPCs not yet supported\n");
299 }
300
301 /* Initialize non-portable parts of the kernel */
303 return TRUE;
304}
#define CODE_SEG(...)
unsigned char BOOLEAN
ULONG_PTR MainSSDT[]
Definition: napi.h:9
UCHAR MainSSPT[]
Definition: napi.h:15
#define DPRINT1
Definition: precomp.h:8
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
VOID NTAPI KeSetTargetProcessorDpc(IN PKDPC Dpc, IN CCHAR Number)
Definition: dpc.c:989
VOID NTAPI KeSetImportanceDpc(IN PKDPC Dpc, IN KDPC_IMPORTANCE Importance)
Definition: dpc.c:976
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
#define MAXIMUM_PROCESSORS
Definition: rwlock.h:5
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define MAXIMUM_PRIORITY
KSPIN_LOCK IopCompletionLock
Definition: krnlinit.c:56
KSPIN_LOCK AfdWorkQueueSpinLock
Definition: krnlinit.c:58
PKPRCB KiProcessorBlock[MAXIMUM_PROCESSORS]
Definition: krnlinit.c:31
EPROCESS KiInitialProcess
Definition: krnlinit.c:41
KSPIN_LOCK MmPfnLock
Definition: krnlinit.c:45
KSPIN_LOCK CcMasterSpinLock
Definition: krnlinit.c:48
KSPIN_LOCK KiTimerTableLock[LOCK_QUEUE_TIMER_TABLE_LOCKS]
Definition: krnlinit.c:59
KSPIN_LOCK IopDatabaseLock
Definition: krnlinit.c:55
KSPIN_LOCK KiReverseStallIpiLock
Definition: krnlinit.c:60
BOOLEAN NTAPI KeInitSystem(VOID)
Definition: krnlinit.c:292
PLOADER_PARAMETER_BLOCK KeLoaderBlock
Definition: krnlinit.c:28
ETHREAD KiInitialThread
Definition: krnlinit.c:40
KSPIN_LOCK NonPagedPoolLock
Definition: krnlinit.c:51
KSPIN_LOCK MmNonPagedPoolLock
Definition: krnlinit.c:52
KSPIN_LOCK CcVacbSpinLock
Definition: krnlinit.c:49
KSPIN_LOCK NtfsStructLock
Definition: krnlinit.c:57
UCHAR KeProcessNodeSeed
Definition: krnlinit.c:37
KSPIN_LOCK KiDispatcherLock
Definition: krnlinit.c:44
KSPIN_LOCK IopVpbSpinLock
Definition: krnlinit.c:54
KSPIN_LOCK MmSystemSpaceLock
Definition: krnlinit.c:46
KSPIN_LOCK IopCancelSpinLock
Definition: krnlinit.c:53
USHORT KeProcessorLevel
Definition: krnlinit.c:20
VOID NTAPI KiInitSystem(VOID)
Definition: krnlinit.c:67
KSPIN_LOCK CcWorkQueueSpinLock
Definition: krnlinit.c:50
UCHAR KeNumberNodes
Definition: krnlinit.c:36
USHORT KeProcessorRevision
Definition: krnlinit.c:21
KSPIN_LOCK CcBcbSpinLock
Definition: krnlinit.c:47
USHORT KeProcessorArchitecture
Definition: krnlinit.c:19
KNODE KiNode0
Definition: krnlinit.c:34
unsigned __int64 ULONG64
Definition: imports.h:198
@ SynchronizationEvent
KTIMER_TABLE_ENTRY KiTimerTableListHead[TIMER_TABLE_SIZE]
Definition: timerobj.c:17
ULONG64 KeFeatureBits
Definition: krnlinit.c:22
LIST_ENTRY KeBugcheckCallbackListHead
Definition: bug.c:22
LIST_ENTRY KiProcessOutSwapListHead
Definition: ke.h:136
FAST_MUTEX KiGenericCallDpcMutex
Definition: dpc.c:24
KEVENT KiSwapEvent
Definition: procobj.c:21
ULONG KiAdjustDpcThreshold
Definition: dpc.c:21
ULONG KiMaximumDpcQueueDepth
Definition: dpc.c:19
BOOLEAN KeThreadDpcEnable
Definition: dpc.c:23
KDPC KiTimerExpireDpc
Definition: dpc.c:25
KSPIN_LOCK BugCheckCallbackLock
Definition: bug.c:24
VOID NTAPI KiInitMachineDependent(VOID)
Definition: kiinit.c:48
ULONG KiMinimumDpcRate
Definition: dpc.c:20
LIST_ENTRY KiProfileListHead
Definition: profobj.c:18
PKNODE KeNodeBlock[1]
Definition: krnlinit.c:35
LARGE_INTEGER NTAPI KiComputeReciprocal(IN LONG Divisor, OUT PUCHAR Shift)
Definition: krnlinit.c:119
LIST_ENTRY KiProcessInSwapListHead
Definition: procobj.c:19
ULONG KiServiceLimit
Definition: krnlinit.c:25
KSPIN_LOCK KiProfileLock
Definition: profobj.c:20
LIST_ENTRY KiStackInSwapListHead
Definition: procobj.c:20
VOID NTAPI KiInitSpinLocks(IN PKPRCB Prcb, IN CCHAR Number)
Definition: krnlinit.c:183
LIST_ENTRY KeBugcheckReasonCallbackListHead
Definition: ke.h:128
LIST_ENTRY KiProfileSourceListHead
Definition: ke.h:133
VOID NTAPI KiTimerExpiration(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
Definition: dpc.c:79
#define NUMBER_OF_SYSCALLS
Definition: napi.h:20
_In_opt_ PENTER_STATE_SYSTEM_HANDLER _In_opt_ PVOID _In_ LONG _In_opt_ LONG volatile * Number
Definition: ntpoapi.h:207
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
KSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable[SSDT_MAX_ENTRIES]
Definition: procobj.c:23
KSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTableShadow[SSDT_MAX_ENTRIES]
Definition: procobj.c:24
base of all file and directory entries
Definition: entries.h:83
ULARGE_INTEGER Time
Definition: ketypes.h:779
$ULONG LowPart
Definition: ntbasedef.h:577
$ULONG HighPart
Definition: ntbasedef.h:578
#define NTAPI
Definition: typedefs.h:36
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define IN
Definition: typedefs.h:39
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char CCHAR
Definition: typedefs.h:51
ULONG LowPart
Definition: typedefs.h:106
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
@ HighImportance
Definition: ketypes.h:695
#define DPC_NORMAL
#define LOCK_QUEUE_TIMER_TABLE_LOCKS
#define TIMER_TABLE_SIZE
Definition: ketypes.h:848
@ LockQueueNtfsStructLock
Definition: ketypes.h:670
@ LockQueueExpansionLock
Definition: ketypes.h:659
@ LockQueueTimerTableLock
Definition: ketypes.h:675
@ LockQueueWorkQueueLock
Definition: ketypes.h:666
@ LockQueueUnusedSpare16
Definition: ketypes.h:674
@ LockQueueNonPagedPoolLock
Definition: ketypes.h:664
@ LockQueueSystemSpaceLock
Definition: ketypes.h:661
@ LockQueueMasterLock
Definition: ketypes.h:663
@ LockQueueDispatcherLock
Definition: ketypes.h:658
@ LockQueueIoCancelLock
Definition: ketypes.h:665
@ LockQueuePfnLock
Definition: ketypes.h:660
@ LockQueueIoDatabaseLock
Definition: ketypes.h:668
@ LockQueueMmNonPagedPoolLock
Definition: ketypes.h:673
@ LockQueueBcbLock
Definition: ketypes.h:672
@ LockQueueIoVpbLock
Definition: ketypes.h:667
@ LockQueueIoCompletionLock
Definition: ketypes.h:669
@ LockQueueAfdWorkQueueLock
Definition: ketypes.h:671
@ LockQueueVacbLock
Definition: ketypes.h:662
_In_ ULONG Shift
Definition: rtlfuncs.h:2698
_In_ LARGE_INTEGER Divisor
Definition: rtlfuncs.h:3061
_In_ LARGE_INTEGER _Out_opt_ PLARGE_INTEGER Remainder
Definition: rtlfuncs.h:3062
unsigned char UCHAR
Definition: xmlstorage.h:181