/*
* PROJECT: ReactOS Kernel
* LICENSE: GPL - See COPYING in the top level directory
- * FILE: ntoskrnl/ke/i386/kiinit.c
+ * FILE: ntoskrnl/ke/amd64/kiinit.c
* PURPOSE: Kernel Initialization for x86 CPUs
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
* Timo Kreuzer (timo.kreuzer@reactos.org)
#include <debug.h>
#define REQUIRED_FEATURE_BITS (KF_RDTSC|KF_CR4|KF_CMPXCHG8B|KF_XMMI|KF_XMMI64| \
- KF_NX_BIT)
+ KF_LARGE_PAGE|KF_FAST_SYSCALL|KF_GLOBAL_PAGE| \
+ KF_CMOV|KF_PAT|KF_MMX|KF_FXSR|KF_NX_BIT|KF_MTRR)
/* GLOBALS *******************************************************************/
+extern BOOLEAN RtlpUse16ByteSLists;
+
/* Function pointer for early debug prints */
ULONG (*FrLdrDbgPrint)(const char *Format, ...);
// KeBugCheckEx(NO_PAGES_AVAILABLE, 2, PAGE_SIZE * 2, 0, 0);
// }
+ /* Initialize 8/16 bit SList support */
+ RtlpUse16ByteSLists = (KeFeatureBits & KF_CMPXCHG16B) ? TRUE: FALSE;
}
VOID
#ifndef CONFIG_SMP
Pcr->Prcb.BuildType |= PRCB_BUILD_UNIPROCESSOR;
#endif
-#ifdef DBG
+#if DBG
Pcr->Prcb.BuildType |= PRCB_BUILD_DEBUG;
#endif
NTAPI
KiInitializeCpu(PKIPCR Pcr)
{
+ ULONG64 Pat;
ULONG FeatureBits;
/* Initialize gs */
__writemsr(MSR_LSTAR, (ULONG64)KiSystemCallEntry64);
__writemsr(MSR_CSTAR, (ULONG64)KiSystemCallEntry32);
- __writemsr(MSR_STAR, ((ULONG64)KGDT64_R0_CODE << 32) |
- ((ULONG64)(KGDT64_R3_CMCODE|RPL_MASK) << 48));
+ __writemsr(MSR_STAR, ((ULONG64)KGDT64_R0_CODE << 32) |
+ ((ULONG64)(KGDT64_R3_CMCODE|RPL_MASK) << 48));
/* Set the flags to be cleared when doing a syscall */
__writemsr(MSR_SYSCALL_MASK, EFLAGS_IF_MASK | EFLAGS_TF | EFLAGS_DF);
- /* Enable syscall instruction */
- __writemsr(MSR_EFER, __readmsr(MSR_EFER) | MSR_SCE);
+ /* Enable syscall instruction and no-execute support */
+ __writemsr(MSR_EFER, __readmsr(MSR_EFER) | MSR_SCE | MSR_NXE);
+
+ /* Initialize the PAT */
+ Pat = (PAT_WB << 0) | (PAT_WC << 8) | (PAT_UCM << 16) | (PAT_UC << 24) |
+ (PAT_WB << 32) | (PAT_WC << 40) | (PAT_UCM << 48) | (PAT_UC << 56);
+ __writemsr(MSR_PAT, Pat);
}
VOID
KeI386CpuStep = Prcb->CpuStep;
KeProcessorArchitecture = PROCESSOR_ARCHITECTURE_AMD64;
KeProcessorLevel = (USHORT)Prcb->CpuType;
- if (Prcb->CpuID) KeProcessorRevision = Prcb->CpuStep;
+ if (Prcb->CpuID)
+ KeProcessorRevision = Prcb->CpuStep;
/* Set basic CPU Features that user mode can read */
+ SharedUserData->ProcessorFeatures[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
+ SharedUserData->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE;
+ SharedUserData->ProcessorFeatures[PF_PPC_MOVEMEM_64BIT_OK] = TRUE;
+ SharedUserData->ProcessorFeatures[PF_PAE_ENABLED] = TRUE; // ???
+ SharedUserData->ProcessorFeatures[PF_NX_ENABLED] = TRUE;
+ SharedUserData->ProcessorFeatures[PF_FASTFAIL_AVAILABLE] = TRUE;
+ SharedUserData->ProcessorFeatures[PF_XSAVE_ENABLED] = TRUE;
SharedUserData->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE] =
(Prcb->FeatureBits & KF_MMX) ? TRUE: FALSE;
- SharedUserData->ProcessorFeatures[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
SharedUserData->ProcessorFeatures[PF_XMMI_INSTRUCTIONS_AVAILABLE] =
((Prcb->FeatureBits & KF_FXSR) && (Prcb->FeatureBits & KF_XMMI)) ? TRUE: FALSE;
SharedUserData->ProcessorFeatures[PF_XMMI64_INSTRUCTIONS_AVAILABLE] =
((Prcb->FeatureBits & KF_FXSR) && (Prcb->FeatureBits & KF_XMMI64)) ? TRUE: FALSE;
SharedUserData->ProcessorFeatures[PF_3DNOW_INSTRUCTIONS_AVAILABLE] =
(Prcb->FeatureBits & KF_3DNOW) ? TRUE: FALSE;
- SharedUserData->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] = TRUE;
+ SharedUserData->ProcessorFeatures[PF_SSE3_INSTRUCTIONS_AVAILABLE] =
+ (Prcb->FeatureBits & KF_SSE3) ? TRUE: FALSE;
+ SharedUserData->ProcessorFeatures[PF_COMPARE_EXCHANGE128] =
+ (Prcb->FeatureBits & KF_CMPXCHG16B) ? TRUE: FALSE;
/* Set the default NX policy (opt-in) */
SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_OPTIN;
SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_ALWAYSOFF;
Prcb->FeatureBits |= KF_NX_DISABLED;
}
-
}
static LDR_DATA_TABLE_ENTRY LdrCoreEntries[3];
KeLoaderBlock = LoaderBlock;
/* Get the current CPU number */
- Cpu = (CCHAR)KeNumberProcessors++; // FIXME
+ Cpu = KeNumberProcessors++; // FIXME
/* LoaderBlock initialization for Cpu 0 */
if (Cpu == 0)