ReactOS 0.4.15-dev-7934-g1dc8d80
kiinit.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for kiinit.c:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define REQUIRED_FEATURE_BITS
 

Functions

UCHAR DECLSPEC_ALIGN (16)
 
void KiInitializeSegments ()
 
void KiSystemCallEntry64 ()
 
void KiSystemCallEntry32 ()
 
VOID NTAPI KiInitMachineDependent (VOID)
 
static VOID KiInitializePcr (_Out_ PKIPCR Pcr, _In_ ULONG ProcessorNumber, _In_ PKGDTENTRY64 GdtBase, _In_ PKIDTENTRY64 IdtBase, _In_ PKTSS64 TssBase, _In_ PKTHREAD IdleThread, _In_ PVOID DpcStack)
 
VOID NTAPI KiInitializeCpu (PKIPCR Pcr)
 
static VOID KiInitializeTss (_In_ PKIPCR Pcr, _Out_ PKTSS64 Tss, _In_ PVOID InitialStack, _In_ PVOID DoubleFaultStack, _In_ PVOID NmiStack)
 
VOID KiInitializeProcessorBootStructures (_In_ ULONG ProcessorNumber, _Out_ PKIPCR Pcr, _In_ PKGDTENTRY64 GdtBase, _In_ PKIDTENTRY64 IdtBase, _In_ PKTSS64 TssBase, _In_ PKTHREAD IdleThread, _In_ PVOID KernelStack, _In_ PVOID DpcStack, _In_ PVOID DoubleFaultStack, _In_ PVOID NmiStack)
 
static VOID KiInitializeP0BootStructures (_Inout_ PLOADER_PARAMETER_BLOCK LoaderBlock)
 
VOID NTAPI KiInitializeKernelMachineDependent (IN PKPRCB Prcb, IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 
void KiInitModuleList (IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 
DECLSPEC_NORETURN VOID NTAPI KiSystemStartup (IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 

Variables

ULONG(* FrLdrDbgPrint )(const char *Format,...)
 
KSPIN_LOCK KiFreezeExecutionLock
 
KIPCR KiInitialPcr
 
PVOID KiP0BootStack = &KiP0BootStackData[KERNEL_STACK_SIZE]
 
PVOID KiP0DoubleFaultStack = &KiP0DoubleFaultStackData[KERNEL_STACK_SIZE]
 
ULONGLONG BootCycles
 
ULONGLONG BootCyclesEnd
 
static LDR_DATA_TABLE_ENTRY LdrCoreEntries [3]
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 13 of file kiinit.c.

◆ REQUIRED_FEATURE_BITS

#define REQUIRED_FEATURE_BITS
Value:
#define KF_MTRR
Definition: ketypes.h:37
#define KF_CR4
Definition: ketypes.h:33
#define KF_XMMI64
Definition: ketypes.h:48
#define KF_CMOV
Definition: ketypes.h:34
#define KF_CMPXCHG8B
Definition: ketypes.h:38
#define KF_RDTSC
Definition: ketypes.h:32
#define KF_FAST_SYSCALL
Definition: ketypes.h:43
#define KF_NX_BIT
Definition: ketypes.h:61
#define KF_FXSR
Definition: ketypes.h:42
#define KF_LARGE_PAGE
Definition: ketypes.h:36
#define KF_XMMI
Definition: ketypes.h:44
#define KF_MMX
Definition: ketypes.h:39
#define KF_PAT
Definition: ketypes.h:41
#define KF_GLOBAL_PAGE
Definition: ketypes.h:35

Definition at line 16 of file kiinit.c.

Function Documentation

◆ DECLSPEC_ALIGN()

UCHAR DECLSPEC_ALIGN ( 16  )

Definition at line 32 of file kiinit.c.

32{0};

◆ KiInitializeCpu()

VOID NTAPI KiInitializeCpu ( PKIPCR  Pcr)

Definition at line 160 of file kiinit.c.

161{
162 ULONG64 Pat;
163 ULONG64 FeatureBits;
164
165 /* Initialize gs */
167
168 /* Set GS base */
171
172 /* Detect and set the CPU Type */
174
175 /* Get the processor features for this CPU */
176 FeatureBits = KiGetFeatureBits();
177
178 /* Check if we support all needed features */
179 if ((FeatureBits & REQUIRED_FEATURE_BITS) != REQUIRED_FEATURE_BITS)
180 {
181 /* If not, bugcheck system */
182 FrLdrDbgPrint("CPU doesn't have needed features! Has: 0x%x, required: 0x%x\n",
183 FeatureBits, REQUIRED_FEATURE_BITS);
184 KeBugCheck(0);
185 }
186
187 /* Set DEP to always on */
189 FeatureBits |= KF_NX_ENABLED;
190
191 /* Save feature bits */
192 Pcr->Prcb.FeatureBits = (ULONG)FeatureBits;
193 Pcr->Prcb.FeatureBitsHigh = FeatureBits >> 32;
194
195 /* Enable fx save restore support */
197
198 /* Enable XMMI exceptions */
200
201 /* Enable Write-Protection */
203
204 /* Disable fpu monitoring */
206
207 /* Disable x87 fpu exceptions */
209
210 /* LDT is unused */
211 __lldt(0);
212
213 /* Set the systemcall entry points */
216
219
220 /* Set the flags to be cleared when doing a syscall */
222
223 /* Enable syscall instruction and no-execute support */
225
226 /* Initialize the PAT */
227 Pat = (PAT_WB << 0) | (PAT_WC << 8) | (PAT_UCM << 16) | (PAT_UC << 24) |
228 (PAT_WB << 32) | (PAT_WC << 40) | (PAT_UCM << 48) | (PAT_UC << 56);
229 __writemsr(MSR_PAT, Pat);
230
231 /* Initialize MXCSR */
233
235}
#define EFLAGS_TF
Definition: SystemCall.c:10
void KiInitializeSegments()
void KiSystemCallEntry32()
ULONG(* FrLdrDbgPrint)(const char *Format,...)
Definition: kiinit.c:23
void KiSystemCallEntry64()
#define REQUIRED_FEATURE_BITS
Definition: kiinit.c:16
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
Definition: bug.c:1431
#define PASSIVE_LEVEL
Definition: env_spec_w32.h:693
PPC_QUAL void __writemsr(const unsigned long Value)
Definition: intrin_ppc.h:748
PPC_QUAL unsigned long long __readmsr()
Definition: intrin_ppc.h:741
__INTRIN_INLINE unsigned long __readcr4(void)
Definition: intrin_x86.h:1825
__INTRIN_INLINE unsigned long __readcr0(void)
Definition: intrin_x86.h:1804
__INTRIN_INLINE void __writecr0(unsigned int Data)
Definition: intrin_x86.h:1789
__INTRIN_INLINE void __writecr4(unsigned int Data)
Definition: intrin_x86.h:1799
unsigned __int64 ULONG64
Definition: imports.h:198
#define EFLAGS_DF
Definition: strlen.c:26
VOID KeSetCurrentIrql(KIRQL NewIrql)
Definition: mpsirql.c:51
#define CR0_NE
Definition: asm.h:250
#define CR0_WP
Definition: asm.h:251
#define CR0_MP
Definition: asm.h:246
#define PAT_UC
Definition: ketypes.h:266
#define CR4_XMMEXCPT
Definition: ketypes.h:154
#define MSR_SCE
Definition: ketypes.h:276
#define MSR_PAT
Definition: ketypes.h:280
#define MSR_GS_SWAP
Definition: ketypes.h:254
#define KGDT64_R0_CODE
Definition: ketypes.h:133
#define MSR_EFER
Definition: ketypes.h:247
#define MSR_SYSCALL_MASK
Definition: ketypes.h:251
#define KGDT64_R3_CMCODE
Definition: ketypes.h:135
#define KF_NX_ENABLED
Definition: ketypes.h:63
#define MSR_STAR
Definition: ketypes.h:248
#define EFLAGS_IF_MASK
Definition: ketypes.h:204
#define MSR_LSTAR
Definition: ketypes.h:249
#define MSR_GS_BASE
Definition: ketypes.h:253
#define PAT_WB
Definition: ketypes.h:270
#define PAT_UCM
Definition: ketypes.h:271
#define CR4_FXSR
Definition: ketypes.h:153
#define MSR_NXE
Definition: ketypes.h:279
#define RPL_MASK
Definition: ketypes.h:130
#define MSR_CSTAR
Definition: ketypes.h:250
#define PAT_WC
Definition: ketypes.h:267
ULONG64 KiGetFeatureBits(VOID)
Evaluates the KeFeatureFlag bits for the current CPU.
Definition: cpu.c:165
VOID KiSetProcessorType(VOID)
Definition: cpu.c:99
#define SharedUserData
#define INITIAL_MXCSR
KPRCB Prcb
Definition: ketypes.h:961
ULONG FeatureBits
Definition: ketypes.h:868
uint32_t ULONG
Definition: typedefs.h:59
#define NX_SUPPORT_POLICY_ALWAYSON
Definition: ketypes.h:1261
void _mm_setcsr(unsigned int a)
Definition: xmmintrin.h:542

Referenced by KiSystemStartup().

◆ KiInitializeKernelMachineDependent()

VOID NTAPI KiInitializeKernelMachineDependent ( IN PKPRCB  Prcb,
IN PLOADER_PARAMETER_BLOCK  LoaderBlock 
)

Definition at line 345 of file kiinit.c.

348{
349 ULONG64 FeatureBits;
350
351 /* Set boot-level flags */
352 KeI386CpuType = Prcb->CpuType;
353 KeI386CpuStep = Prcb->CpuStep;
355 KeProcessorLevel = (USHORT)Prcb->CpuType;
356 if (Prcb->CpuID)
357 KeProcessorRevision = Prcb->CpuStep;
358
359 FeatureBits = Prcb->FeatureBits | (ULONG64)Prcb->FeatureBitsHigh << 32;
360
361 /* Set basic CPU Features that user mode can read */
363 SharedUserData->ProcessorFeatures[PF_FLOATING_POINT_EMULATED] = FALSE;
364 SharedUserData->ProcessorFeatures[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
366 (FeatureBits & KF_MMX) ? TRUE : FALSE;
368 ((FeatureBits & KF_FXSR) && (FeatureBits & KF_XMMI)) ? TRUE : FALSE;
370 (FeatureBits & KF_3DNOW) ? TRUE : FALSE;
372 SharedUserData->ProcessorFeatures[PF_PAE_ENABLED] = TRUE; // ???
374 ((FeatureBits & KF_FXSR) && (FeatureBits & KF_XMMI64)) ? TRUE : FALSE;
375 SharedUserData->ProcessorFeatures[PF_SSE_DAZ_MODE_AVAILABLE] = FALSE; // ???
376 SharedUserData->ProcessorFeatures[PF_NX_ENABLED] = TRUE;
378 (FeatureBits & KF_SSE3) ? TRUE : FALSE;
379 SharedUserData->ProcessorFeatures[PF_COMPARE_EXCHANGE128] =
380 (FeatureBits & KF_CMPXCHG16B) ? TRUE : FALSE;
381 SharedUserData->ProcessorFeatures[PF_COMPARE64_EXCHANGE128] = FALSE; // ???
382 SharedUserData->ProcessorFeatures[PF_CHANNELS_ENABLED] = FALSE; // ???
383 SharedUserData->ProcessorFeatures[PF_XSAVE_ENABLED] = FALSE; // FIXME
385 (FeatureBits & KF_SLAT) ? TRUE : FALSE;
386 SharedUserData->ProcessorFeatures[PF_VIRT_FIRMWARE_ENABLED] =
387 (FeatureBits & KF_VIRT_FIRMWARE_ENABLED) ? TRUE : FALSE;
388 SharedUserData->ProcessorFeatures[PF_RDWRFSGSBASE_AVAILABLE] =
389 (FeatureBits & KF_RDWRFSGSBASE) ? TRUE : FALSE;
390 SharedUserData->ProcessorFeatures[PF_FASTFAIL_AVAILABLE] = TRUE;
392 (FeatureBits & KF_RDRAND) ? TRUE : FALSE;
394 (FeatureBits & KF_RDTSCP) ? TRUE : FALSE;
395 SharedUserData->ProcessorFeatures[PF_RDPID_INSTRUCTION_AVAILABLE] = FALSE; // ???
397 (FeatureBits & KF_SSSE3) ? TRUE : FALSE;
399 (FeatureBits & KF_SSE4_1) ? TRUE : FALSE;
401 (FeatureBits & KF_SSE4_2) ? TRUE : FALSE;
402 SharedUserData->ProcessorFeatures[PF_AVX_INSTRUCTIONS_AVAILABLE] = FALSE; // FIXME
403 SharedUserData->ProcessorFeatures[PF_AVX2_INSTRUCTIONS_AVAILABLE] = FALSE; // FIXME
404 SharedUserData->ProcessorFeatures[PF_AVX512F_INSTRUCTIONS_AVAILABLE] = FALSE; // FIXME
405
406 /* Set the default NX policy (opt-in) */
407 SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_OPTIN;
408
409 /* Check if NPX is always on */
410 if (strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=ALWAYSON"))
411 {
412 /* Set it always on */
414 Prcb->FeatureBits |= KF_NX_ENABLED;
415 }
416 else if (strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=OPTOUT"))
417 {
418 /* Set it in opt-out mode */
419 SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_OPTOUT;
420 Prcb->FeatureBits |= KF_NX_ENABLED;
421 }
422 else if ((strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=OPTIN")) ||
423 (strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE")))
424 {
425 /* Set the feature bits */
426 Prcb->FeatureBits |= KF_NX_ENABLED;
427 }
428 else if ((strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=ALWAYSOFF")) ||
429 (strstr(KeLoaderBlock->LoadOptions, "EXECUTE")))
430 {
431 /* Set disabled mode */
433 Prcb->FeatureBits |= KF_NX_DISABLED;
434 }
435
436#if DBG
437 /* Print applied kernel features/policies and boot CPU features */
438 KiReportCpuFeatures(Prcb);
439#endif
440}
char * strstr(char *String1, char *String2)
Definition: utclib.c:653
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
PLOADER_PARAMETER_BLOCK KeLoaderBlock
Definition: krnlinit.c:29
if(dx< 0)
Definition: linetemp.h:194
#define KF_SSE4_2
Definition: ketypes.h:74
#define KF_SSSE3
Definition: ketypes.h:72
#define KF_VIRT_FIRMWARE_ENABLED
Definition: ketypes.h:59
#define KF_CMPXCHG16B
Definition: ketypes.h:52
#define KF_NX_DISABLED
Definition: ketypes.h:62
#define KF_SSE4_1
Definition: ketypes.h:73
#define KF_RDWRFSGSBASE
Definition: ketypes.h:60
#define KF_3DNOW
Definition: ketypes.h:45
#define KF_RDRAND
Definition: ketypes.h:64
#define KF_SSE3
Definition: ketypes.h:51
#define KF_SLAT
Definition: ketypes.h:58
#define KF_RDTSCP
Definition: ketypes.h:66
#define PROCESSOR_ARCHITECTURE_AMD64
Definition: ketypes.h:114
ULONG KeI386CpuType
Definition: cpu.c:24
ULONG KeI386CpuStep
Definition: cpu.c:25
USHORT KeProcessorLevel
Definition: krnlinit.c:20
USHORT KeProcessorRevision
Definition: krnlinit.c:21
USHORT KeProcessorArchitecture
Definition: krnlinit.c:19
unsigned short USHORT
Definition: pedump.c:61
#define PF_RDWRFSGSBASE_AVAILABLE
Definition: ketypes.h:146
#define PF_CHANNELS_ENABLED
Definition: ketypes.h:140
#define PF_PAE_ENABLED
Definition: ketypes.h:133
#define PF_SECOND_LEVEL_ADDRESS_TRANSLATION
Definition: ketypes.h:144
#define NX_SUPPORT_POLICY_ALWAYSOFF
Definition: ketypes.h:1260
#define PF_XSAVE_ENABLED
Definition: ketypes.h:141
#define PF_3DNOW_INSTRUCTIONS_AVAILABLE
Definition: ketypes.h:131
#define PF_RDPID_INSTRUCTION_AVAILABLE
Definition: ketypes.h:157
#define PF_SSE4_2_INSTRUCTIONS_AVAILABLE
Definition: ketypes.h:161
#define PF_MMX_INSTRUCTIONS_AVAILABLE
Definition: ketypes.h:127
#define PF_XMMI64_INSTRUCTIONS_AVAILABLE
Definition: ketypes.h:134
#define PF_VIRT_FIRMWARE_ENABLED
Definition: ketypes.h:145
#define PF_XMMI_INSTRUCTIONS_AVAILABLE
Definition: ketypes.h:130
#define NX_SUPPORT_POLICY_OPTIN
Definition: ketypes.h:1262
#define PF_AVX2_INSTRUCTIONS_AVAILABLE
Definition: ketypes.h:163
#define PF_SSSE3_INSTRUCTIONS_AVAILABLE
Definition: ketypes.h:159
#define NX_SUPPORT_POLICY_OPTOUT
Definition: ketypes.h:1263
#define PF_FLOATING_POINT_PRECISION_ERRATA
Definition: ketypes.h:124
#define PF_AVX_INSTRUCTIONS_AVAILABLE
Definition: ketypes.h:162
#define PF_COMPARE_EXCHANGE_DOUBLE
Definition: ketypes.h:126
#define PF_FASTFAIL_AVAILABLE
Definition: ketypes.h:147
#define PF_FLOATING_POINT_EMULATED
Definition: ketypes.h:125
#define PF_SSE3_INSTRUCTIONS_AVAILABLE
Definition: ketypes.h:137
#define PF_SSE_DAZ_MODE_AVAILABLE
Definition: ketypes.h:135
#define PF_AVX512F_INSTRUCTIONS_AVAILABLE
Definition: ketypes.h:164
#define PF_RDRAND_INSTRUCTION_AVAILABLE
Definition: ketypes.h:152
#define PF_RDTSC_INSTRUCTION_AVAILABLE
Definition: ketypes.h:132
#define PF_NX_ENABLED
Definition: ketypes.h:136
#define PF_COMPARE64_EXCHANGE128
Definition: ketypes.h:139
#define PF_COMPARE_EXCHANGE128
Definition: ketypes.h:138
#define PF_SSE4_1_INSTRUCTIONS_AVAILABLE
Definition: ketypes.h:160
#define PF_RDTSCP_INSTRUCTION_AVAILABLE
Definition: ketypes.h:156

Referenced by KiSystemStartup().

◆ KiInitializeP0BootStructures()

static VOID KiInitializeP0BootStructures ( _Inout_ PLOADER_PARAMETER_BLOCK  LoaderBlock)
static

Definition at line 308 of file kiinit.c.

310{
311 KDESCRIPTOR GdtDescriptor = {{0},0,0}, IdtDescriptor = {{0},0,0};
312 PKGDTENTRY64 TssEntry;
313 PKTSS64 TssBase;
314
315 /* Set the initial stack, idle thread and process for processor 0 */
316 LoaderBlock->KernelStack = (ULONG_PTR)KiP0BootStack;
317 LoaderBlock->Thread = (ULONG_PTR)&KiInitialThread;
318 LoaderBlock->Process = (ULONG_PTR)&KiInitialProcess.Pcb;
319 LoaderBlock->Prcb = (ULONG_PTR)&KiInitialPcr.Prcb;
320
321 /* Get GDT and IDT descriptors */
322 __sgdt(&GdtDescriptor.Limit);
323 __sidt(&IdtDescriptor.Limit);
324
325 /* Get the boot TSS from the GDT */
326 TssEntry = KiGetGdtEntry(GdtDescriptor.Base, KGDT64_SYS_TSS);
327 TssBase = KiGetGdtDescriptorBase(TssEntry);
328
329 /* Initialize PCR and TSS */
332 GdtDescriptor.Base,
333 IdtDescriptor.Base,
334 TssBase,
340}
FORCEINLINE PKGDTENTRY64 KiGetGdtEntry(PVOID pGdt, USHORT Selector)
Definition: intrin_i.h:13
FORCEINLINE PVOID KiGetGdtDescriptorBase(PKGDTENTRY Entry)
Definition: intrin_i.h:20
PVOID KiP0DoubleFaultStack
Definition: kiinit.c:35
KIPCR KiInitialPcr
Definition: kiinit.c:29
VOID KiInitializeProcessorBootStructures(_In_ ULONG ProcessorNumber, _Out_ PKIPCR Pcr, _In_ PKGDTENTRY64 GdtBase, _In_ PKIDTENTRY64 IdtBase, _In_ PKTSS64 TssBase, _In_ PKTHREAD IdleThread, _In_ PVOID KernelStack, _In_ PVOID DpcStack, _In_ PVOID DoubleFaultStack, _In_ PVOID NmiStack)
Definition: kiinit.c:275
PVOID KiP0BootStack
Definition: kiinit.c:34
#define ULONG_PTR
Definition: config.h:101
__INTRIN_INLINE void __sidt(void *Destination)
Definition: intrin_x86.h:2023
#define KGDT64_SYS_TSS
Definition: ketypes.h:138
EPROCESS KiInitialProcess
Definition: krnlinit.c:45
ETHREAD KiInitialThread
Definition: krnlinit.c:44
KPROCESS Pcb
Definition: pstypes.h:1262
KTHREAD Tcb
Definition: pstypes.h:1103
PVOID Base
Definition: ketypes.h:556
USHORT Limit
Definition: ketypes.h:555
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by KiSystemStartup().

◆ KiInitializePcr()

static VOID KiInitializePcr ( _Out_ PKIPCR  Pcr,
_In_ ULONG  ProcessorNumber,
_In_ PKGDTENTRY64  GdtBase,
_In_ PKIDTENTRY64  IdtBase,
_In_ PKTSS64  TssBase,
_In_ PKTHREAD  IdleThread,
_In_ PVOID  DpcStack 
)
static

Definition at line 92 of file kiinit.c.

100{
101 /* Zero out the PCR */
102 RtlZeroMemory(Pcr, sizeof(KIPCR));
103
104 /* Set pointers to ourselves */
105 Pcr->Self = (PKPCR)Pcr;
106 Pcr->CurrentPrcb = &Pcr->Prcb;
107
108 /* Set the PCR Version */
109 Pcr->MajorVersion = PCR_MAJOR_VERSION;
110 Pcr->MinorVersion = PCR_MINOR_VERSION;
111
112 /* Set the PRCB Version */
113 Pcr->Prcb.MajorVersion = PRCB_MAJOR_VERSION;
114 Pcr->Prcb.MinorVersion = PRCB_MINOR_VERSION;
115
116 /* Set the Build Type */
117 Pcr->Prcb.BuildType = 0;
118#ifndef CONFIG_SMP
119 Pcr->Prcb.BuildType |= PRCB_BUILD_UNIPROCESSOR;
120#endif
121#if DBG
122 Pcr->Prcb.BuildType |= PRCB_BUILD_DEBUG;
123#endif
124
125 /* Set the Processor Number and current Processor Mask */
126 Pcr->Prcb.Number = (UCHAR)ProcessorNumber;
127 Pcr->Prcb.SetMember = 1ULL << ProcessorNumber;
128
129 /* Set GDT and IDT base */
130 Pcr->GdtBase = GdtBase;
131 Pcr->IdtBase = IdtBase;
132
133 /* Set TssBase */
134 Pcr->TssBase = TssBase;
135
136 Pcr->Prcb.RspBase = Pcr->TssBase->Rsp0; // FIXME
137
138 /* Set DPC Stack */
139 Pcr->Prcb.DpcStack = DpcStack;
140
141 /* Setup the processor set */
142 Pcr->Prcb.MultiThreadProcessorSet = Pcr->Prcb.SetMember;
143
144 /* Clear DR6/7 to cleanup bootloader debugging */
145 Pcr->Prcb.ProcessorState.SpecialRegisters.KernelDr6 = 0;
146 Pcr->Prcb.ProcessorState.SpecialRegisters.KernelDr7 = 0;
147
148 /* Initialize MXCSR (all exceptions masked) */
149 Pcr->Prcb.MxCsr = INITIAL_MXCSR;
150
151 /* Set the Current Thread */
152 Pcr->Prcb.CurrentThread = IdleThread;
153
154 /* Start us out at PASSIVE_LEVEL */
155 Pcr->Irql = PASSIVE_LEVEL;
156}
#define PRCB_MINOR_VERSION
Definition: ketypes.h:306
#define PRCB_MAJOR_VERSION
Definition: ketypes.h:307
#define PRCB_BUILD_UNIPROCESSOR
Definition: ketypes.h:309
#define PRCB_BUILD_DEBUG
Definition: ketypes.h:308
#define PCR_MINOR_VERSION
Definition: ke.h:290
struct _KPCR * PKPCR
#define PCR_MAJOR_VERSION
Definition: ke.h:291
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by KiInitializeProcessorBootStructures(), KiInitializeSystem(), and KiSystemStartup().

◆ KiInitializeProcessorBootStructures()

VOID KiInitializeProcessorBootStructures ( _In_ ULONG  ProcessorNumber,
_Out_ PKIPCR  Pcr,
_In_ PKGDTENTRY64  GdtBase,
_In_ PKIDTENTRY64  IdtBase,
_In_ PKTSS64  TssBase,
_In_ PKTHREAD  IdleThread,
_In_ PVOID  KernelStack,
_In_ PVOID  DpcStack,
_In_ PVOID  DoubleFaultStack,
_In_ PVOID  NmiStack 
)

Definition at line 275 of file kiinit.c.

286{
287 /* Initialize the PCR */
288 KiInitializePcr(Pcr,
289 ProcessorNumber,
290 GdtBase,
291 IdtBase,
292 TssBase,
293 IdleThread,
294 DpcStack);
295
296
297 /* Setup the TSS descriptor and entries */
298 KiInitializeTss(Pcr,
299 TssBase,
300 KernelStack,
301 DoubleFaultStack,
302 NmiStack);
303}
static VOID KiInitializePcr(_Out_ PKIPCR Pcr, _In_ ULONG ProcessorNumber, _In_ PKGDTENTRY64 GdtBase, _In_ PKIDTENTRY64 IdtBase, _In_ PKTSS64 TssBase, _In_ PKTHREAD IdleThread, _In_ PVOID DpcStack)
Definition: kiinit.c:92
static VOID KiInitializeTss(_In_ PKIPCR Pcr, _Out_ PKTSS64 Tss, _In_ PVOID InitialStack, _In_ PVOID DoubleFaultStack, _In_ PVOID NmiStack)
Definition: kiinit.c:239

Referenced by KiInitializeP0BootStructures().

◆ KiInitializeSegments()

void KiInitializeSegments ( )

Referenced by KiInitializeCpu().

◆ KiInitializeTss()

static VOID KiInitializeTss ( _In_ PKIPCR  Pcr,
_Out_ PKTSS64  Tss,
_In_ PVOID  InitialStack,
_In_ PVOID  DoubleFaultStack,
_In_ PVOID  NmiStack 
)
static

Definition at line 239 of file kiinit.c.

245{
246 PKGDTENTRY64 TssEntry;
247
248 /* Get pointer to the GDT entry */
249 TssEntry = KiGetGdtEntry(Pcr->GdtBase, KGDT64_SYS_TSS);
250
251 /* Initialize the GDT entry */
252 KiInitGdtEntry(TssEntry, (ULONG64)Tss, sizeof(KTSS64), AMD64_TSS, 0);
253
254 /* Zero out the TSS */
255 RtlZeroMemory(Tss, sizeof(KTSS64));
256
257 /* FIXME: I/O Map? */
258 Tss->IoMapBase = 0x68;
259
260 /* Setup ring 0 stack pointer */
261 Tss->Rsp0 = (ULONG64)InitialStack;
262
263 /* Setup a stack for Double Fault Traps */
264 Tss->Ist[1] = (ULONG64)DoubleFaultStack;
265
266 /* Setup a stack for CheckAbort Traps */
267 Tss->Ist[2] = (ULONG64)DoubleFaultStack;
268
269 /* Setup a stack for NMI Traps */
270 Tss->Ist[3] = (ULONG64)NmiStack;
271}
FORCEINLINE VOID KiInitGdtEntry(PKGDTENTRY64 Entry, ULONG64 Base, ULONG Size, UCHAR Type, UCHAR Dpl)
Definition: intrin_i.h:48
#define AMD64_TSS
Definition: ke.h:85

Referenced by KiInitializeProcessorBootStructures().

◆ KiInitMachineDependent()

VOID NTAPI KiInitMachineDependent ( VOID  )

Definition at line 48 of file kiinit.c.

49{
50 /* Check for large page support */
52 {
53 /* FIXME: Support this */
54 DPRINT("Large Page support detected but not yet taken advantage of!\n");
55 }
56
57 /* Check for global page support */
59 {
60 /* FIXME: Support this */
61 DPRINT("Global Page support detected but not yet taken advantage of!\n");
62 }
63
64 /* Check if we have MTRR */
66 {
67 /* FIXME: Support this */
68 DPRINT("MTRR support detected but not yet taken advantage of!\n");
69 }
70
71 /* Check for PAT and/or MTRR support */
73 {
74 /* FIXME: Support this */
75 DPRINT("PAT support detected but not yet taken advantage of!\n");
76 }
77
78// /* Allocate the IOPM save area */
79// Ki386IopmSaveArea = ExAllocatePoolWithTag(PagedPool,
80// IOPM_SIZE,
81// ' eK');
82// if (!Ki386IopmSaveArea)
83// {
84// /* Bugcheck. We need this for V86/VDM support. */
85// KeBugCheckEx(NO_PAGES_AVAILABLE, 2, IOPM_SIZE, 0, 0);
86// }
87
88}
ULONG KeFeatureBits
Definition: krnlinit.c:22
#define DPRINT
Definition: sndvol32.h:71

◆ KiInitModuleList()

void KiInitModuleList ( IN PLOADER_PARAMETER_BLOCK  LoaderBlock)

Definition at line 445 of file kiinit.c.

446{
447 PLDR_DATA_TABLE_ENTRY LdrEntry;
449 ULONG i;
450
451 /* Initialize the list head */
453
454 /* Loop the first 3 entries */
455 for (Entry = LoaderBlock->LoadOrderListHead.Flink, i = 0;
456 Entry != &LoaderBlock->LoadOrderListHead && i < 3;
457 Entry = Entry->Flink, i++)
458 {
459 /* Get the data table entry */
460 LdrEntry = CONTAINING_RECORD(Entry,
462 InLoadOrderLinks);
463
464 /* Copy the entry */
465 LdrCoreEntries[i] = *LdrEntry;
466
467 /* Insert the copy into the list */
469 }
470}
static LDR_DATA_TABLE_ENTRY LdrCoreEntries[3]
Definition: kiinit.c:442
#define InsertTailList(ListHead, Entry)
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
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
LIST_ENTRY PsLoadedModuleList
Definition: sysldr.c:21
base of all file and directory entries
Definition: entries.h:83
Definition: btrfs_drv.h:1876
Definition: typedefs.h:120
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by KiSystemStartup().

◆ KiSystemCallEntry32()

void KiSystemCallEntry32 ( )

Referenced by KiInitializeCpu().

◆ KiSystemCallEntry64()

void KiSystemCallEntry64 ( )

Referenced by KiInitializeCpu().

◆ KiSystemStartup()

DECLSPEC_NORETURN VOID NTAPI KiSystemStartup ( IN PLOADER_PARAMETER_BLOCK  LoaderBlock)

Definition at line 476 of file kiinit.c.

477{
478 CCHAR Cpu;
479 PKTHREAD InitialThread;
480 ULONG64 InitialStack;
481 PKIPCR Pcr;
482
483 /* Boot cycles timestamp */
485
486 /* HACK */
487 FrLdrDbgPrint = LoaderBlock->u.I386.CommonDataArea;
488 //FrLdrDbgPrint("Hello from KiSystemStartup!!!\n");
489
490 /* Get the current CPU number */
491 Cpu = KeNumberProcessors++; // FIXME
492
493 /* LoaderBlock initialization for Cpu 0 */
494 if (Cpu == 0)
495 {
496 /* Save the loader block */
497 KeLoaderBlock = LoaderBlock;
498
499 /* Prepare LoaderBlock, PCR, TSS with the P0 boot data */
500 KiInitializeP0BootStructures(LoaderBlock);
501 }
502
503 /* Get Pcr from loader block */
504 Pcr = CONTAINING_RECORD(LoaderBlock->Prcb, KIPCR, Prcb);
505
506 /* Set the PRCB for this Processor */
507 KiProcessorBlock[Cpu] = &Pcr->Prcb;
508
509 /* Align stack to 16 bytes */
510 LoaderBlock->KernelStack &= ~(16 - 1);
511
512 /* Save the initial thread and stack */
513 InitialStack = LoaderBlock->KernelStack; // Checkme
514 InitialThread = (PKTHREAD)LoaderBlock->Thread;
515
516 /* Set us as the current process */
517 InitialThread->ApcState.Process = (PVOID)LoaderBlock->Process;
518
519 /* Initialize the CPU features */
520 KiInitializeCpu(Pcr);
521
522 /* Initial setup for the boot CPU */
523 if (Cpu == 0)
524 {
525 /* Initialize the module list (ntos, hal, kdcom) */
526 KiInitModuleList(LoaderBlock);
527
528 /* Setup the IDT */
530
531 /* Initialize debugging system */
533
534 /* Check for break-in */
536 }
537
538 DPRINT1("Pcr = %p, Gdt = %p, Idt = %p, Tss = %p\n",
539 Pcr, Pcr->GdtBase, Pcr->IdtBase, Pcr->TssBase);
540
541 /* Acquire lock */
542 while (InterlockedBitTestAndSet64((PLONG64)&KiFreezeExecutionLock, 0))
543 {
544 /* Loop until lock is free */
545 while ((*(volatile KSPIN_LOCK*)&KiFreezeExecutionLock) & 1);
546 }
547
548 /* Initialize the Processor with HAL */
550
551 /* Set processor as active */
552 KeActiveProcessors |= 1ULL << Cpu;
553
554 /* Release lock */
556
557 /* Raise to HIGH_LEVEL */
559
560 /* Machine specific kernel initialization */
561 if (Cpu == 0) KiInitializeKernelMachineDependent(&Pcr->Prcb, LoaderBlock);
562
563 /* Switch to new kernel stack and start kernel bootstrapping */
564 KiSwitchToBootStack(InitialStack & ~3);
565}
static VOID KiInitializeP0BootStructures(_Inout_ PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: kiinit.c:308
KSPIN_LOCK KiFreezeExecutionLock
Definition: kiinit.c:26
void KiInitModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: kiinit.c:445
VOID NTAPI KiInitializeKernelMachineDependent(IN PKPRCB Prcb, IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: kiinit.c:345
VOID NTAPI KiInitializeCpu(PKIPCR Pcr)
Definition: kiinit.c:160
ULONGLONG BootCycles
Definition: kiinit.c:37
#define DPRINT1
Definition: precomp.h:8
__int64 * PLONG64
Definition: basetsd.h:183
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
#define HIGH_LEVEL
Definition: env_spec_w32.h:703
KIRQL FASTCALL KfRaiseIrql(IN KIRQL NewIrql)
Definition: pic.c:187
VOID NTAPI HalInitializeProcessor(IN ULONG ProcessorNumber, IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: processor.c:48
#define InterlockedAnd64
Definition: interlocked.h:87
PPC_QUAL unsigned long long __rdtsc(void)
Definition: intrin_ppc.h:688
BOOLEAN NTAPI KdInitSystem(_In_ ULONG BootPhase, _In_opt_ PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: kdinit.c:142
BOOLEAN NTAPI KdPollBreakIn(VOID)
Definition: kdlock.c:75
CCHAR KeNumberProcessors
Definition: krnlinit.c:35
#define DBG_STATUS_CONTROL_C
Definition: kdtypes.h:39
struct _KTHREAD * PKTHREAD
Definition: nt_native.h:28
DECLSPEC_NORETURN VOID KiSwitchToBootStack(IN ULONG_PTR InitialStack)
Definition: ke.h:868
PKPRCB KiProcessorBlock[]
Definition: krnlinit.c:32
KAFFINITY KeActiveProcessors
Definition: krnlinit.c:23
VOID NTAPI KeInitExceptions(VOID)
Definition: except.c:59
union _KGDTENTRY64 * GdtBase
Definition: ketypes.h:932
struct _KTSS64 * TssBase
Definition: ketypes.h:933
union _KIDTENTRY64 * IdtBase
Definition: ketypes.h:941
KAPC_STATE ApcState
Definition: ketypes.h:1778
char CCHAR
Definition: typedefs.h:51
__analysis_noreturn NTSYSAPI VOID NTAPI DbgBreakPointWithStatus(_In_ ULONG Status)

Variable Documentation

◆ BootCycles

ULONGLONG BootCycles

Definition at line 37 of file kiinit.c.

Referenced by KiSystemStartup().

◆ BootCyclesEnd

ULONGLONG BootCyclesEnd

Definition at line 37 of file kiinit.c.

◆ FrLdrDbgPrint

ULONG(* FrLdrDbgPrint) (const char *Format,...) ( const char Format,
  ... 
)

Definition at line 23 of file kiinit.c.

Referenced by KiInitializeCpu(), and KiSystemStartup().

◆ KiFreezeExecutionLock

KSPIN_LOCK KiFreezeExecutionLock

Definition at line 26 of file kiinit.c.

Referenced by KiInitializeKernel(), and KiSystemStartup().

◆ KiInitialPcr

KIPCR KiInitialPcr

Definition at line 29 of file kiinit.c.

Referenced by KiInitializeP0BootStructures().

◆ KiP0BootStack

PVOID KiP0BootStack = &KiP0BootStackData[KERNEL_STACK_SIZE]

Definition at line 34 of file kiinit.c.

Referenced by KiInitializeP0BootStructures().

◆ KiP0DoubleFaultStack

PVOID KiP0DoubleFaultStack = &KiP0DoubleFaultStackData[KERNEL_STACK_SIZE]

Definition at line 35 of file kiinit.c.

Referenced by KiInitializeP0BootStructures().

◆ LdrCoreEntries

LDR_DATA_TABLE_ENTRY LdrCoreEntries[3]
static

Definition at line 442 of file kiinit.c.

Referenced by KiInitModuleList().