Author: tkreuzer
Date: Thu Jul 24 18:04:22 2008
New Revision: 34765
URL:
http://svn.reactos.org/svn/reactos?rev=34765&view=rev
Log:
- add ke/amd64/boot.S containing KiSystemStartup
- add ke/amd64/kiinit.c, stubbed out
- allow warnings for now, so we can compile a lot more files
Added:
branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/
branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/boot.S (with props)
branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c (with props)
Modified:
branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl-generic.rbuild
branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl.rbuild
Added: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/boot.S
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntosk…
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/boot.S (added)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/boot.S [iso-8859-1] Thu Jul 24
18:04:22 2008
@@ -1,0 +1,86 @@
+/*
+ * FILE: ntoskrnl/ke/i386/boot.S
+ * COPYRIGHT: See COPYING in the top level directory
+ * PURPOSE: FreeLDR Wrapper Bootstrap Code and Bootstrap Trampoline
+ * PROGRAMMERs: Alex Ionescu (alex(a)relsoft.net)
+ * Thomas Weidenmueller <w3seek(a)reactos.org>
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include <asm.h>
+.intel_syntax noprefix
+.code64
+
+/* GLOBALS *******************************************************************/
+
+.bss
+.align 16
+
+/* Kernel Boot Stack */
+.globl _P0BootStack
+.space KERNEL_STACK_SIZE
+_P0BootStack:
+
+/* Kernel Double-Fault and Temporary DPC Stack */
+.globl _KiDoubleFaultStack
+.space KERNEL_STACK_SIZE
+_KiDoubleFaultStack:
+
+/* FUNCTIONS *****************************************************************/
+.global _KiSystemStartup
+.text
+.func KiSystemStartup
+_KiSystemStartup:
+
+ /* NTLDR Boot: Call the main kernel initialization */
+ test rcx, 0x80000000
+ jnz _KiSystemStartupReal
+
+ /* FREELDR Boot: Cal the FreeLDR wrapper */
+ jmp _KiRosPrepareForSystemStartup
+.endfunc
+
+/**
+ * VOID
+ * KiSetupStackAndInitializeKernel(
+ * esp+4 = ? -> rcx
+ * esp+8 = ? -> rdx
+ * PVOID pNewstack // esp+12 = new stack -> r8
+ * esp+16 -> r9
+ * esp+20 -> rsp + 8
+ * esp+24 -> rsp + 16?
+ */
+.globl _KiSetupStackAndInitializeKernel
+.func KiSetupStackAndInitializeKernel
+_KiSetupStackAndInitializeKernel:
+
+ /* Save current stack */
+ mov rsi, rsp
+
+ /* Setup the new stack */
+ mov rsp, r8
+ sub rsp, NPX_FRAME_LENGTH + KTRAP_FRAME_ALIGN + KTRAP_FRAME_LENGTH
+ push CR0_EM + CR0_TS + CR0_MP
+
+ /* Copy stack parameters to the new stack */
+ push [rsi + 16]
+ push [rsi + 8]
+ xor rbp, rbp
+ call _KiInitializeKernel
+
+ /* Set the priority of this thread to 0 */
+ mov rbx, PCR[KPCR_CURRENT_THREAD]
+ mov byte ptr [rbx+KTHREAD_PRIORITY], 0
+
+ /* Force interrupts enabled and lower IRQL back to DISPATCH_LEVEL */
+ sti
+ mov rcx, DISPATCH_LEVEL
+ call _KfLowerIrql
+
+ /* Set the right wait IRQL */
+ mov byte ptr [rbx+KTHREAD_WAIT_IRQL], DISPATCH_LEVEL;
+
+ /* Jump into the idle loop */
+ jmp _KiIdleLoop
+.endfunc
Propchange: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/boot.S
------------------------------------------------------------------------------
svn:eol-style = native
Added: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntosk…
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c (added)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c [iso-8859-1] Thu Jul 24
18:04:22 2008
@@ -1,0 +1,785 @@
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: ntoskrnl/ke/i386/kiinit.c
+ * PURPOSE: Kernel Initialization for x86 CPUs
+ * PROGRAMMERS: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+/* GLOBALS *******************************************************************/
+
+/* Spinlocks used only on X86 */
+KSPIN_LOCK KiFreezeExecutionLock;
+KSPIN_LOCK Ki486CompatibilityLock;
+
+/* BIOS Memory Map. Not NTLDR-compliant yet */
+extern ULONG KeMemoryMapRangeCount;
+extern ADDRESS_RANGE KeMemoryMap[64];
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+NTAPI
+KiInitMachineDependent(VOID)
+{
+#if 0
+ ULONG Protect;
+ ULONG CpuCount;
+ BOOLEAN FbCaching = FALSE;
+ NTSTATUS Status;
+ ULONG ReturnLength;
+ ULONG i, Affinity, Sample = 0;
+ PFX_SAVE_AREA FxSaveArea;
+ ULONG MXCsrMask = 0xFFBF;
+ ULONG Dummy[4];
+ KI_SAMPLE_MAP Samples[4];
+ PKI_SAMPLE_MAP CurrentSample = Samples;
+
+ /* Check for large page support */
+ if (KeFeatureBits & KF_LARGE_PAGE)
+ {
+ /* FIXME: Support this */
+ DPRINT1("Large Page support detected but not yet taken advantage
of!\n");
+ }
+
+ /* Check for global page support */
+ if (KeFeatureBits & KF_GLOBAL_PAGE)
+ {
+ /* Do an IPI to enable it on all CPUs */
+ CpuCount = KeNumberProcessors;
+ KeIpiGenericCall(Ki386EnableGlobalPage, (ULONG_PTR)&CpuCount);
+ }
+
+ /* Check for PAT and/or MTRR support */
+ if (KeFeatureBits & (KF_PAT | KF_MTRR))
+ {
+ /* Query the HAL to make sure we can use it */
+ Status = HalQuerySystemInformation(HalFrameBufferCachingInformation,
+ sizeof(BOOLEAN),
+ &FbCaching,
+ &ReturnLength);
+ if ((NT_SUCCESS(Status)) && (FbCaching))
+ {
+ /* We can't, disable it */
+ KeFeatureBits &= ~(KF_PAT | KF_MTRR);
+ }
+ }
+
+ /* Check for PAT support and enable it */
+ if (KeFeatureBits & KF_PAT) KiInitializePAT();
+
+ /* Assume no errata for now */
+ SharedUserData->ProcessorFeatures[PF_FLOATING_POINT_PRECISION_ERRATA] = 0;
+
+ /* Check if we have an NPX */
+ if (KeI386NpxPresent)
+ {
+ /* Loop every CPU */
+ i = KeActiveProcessors;
+ for (Affinity = 1; i; Affinity <<= 1)
+ {
+ /* Check if this is part of the set */
+ if (i & Affinity)
+ {
+ /* Run on this CPU */
+ i &= ~Affinity;
+ KeSetSystemAffinityThread(Affinity);
+
+ /* Detect FPU errata */
+ if (KiIsNpxErrataPresent())
+ {
+ /* Disable NPX support */
+ KeI386NpxPresent = FALSE;
+ SharedUserData->
+ ProcessorFeatures[PF_FLOATING_POINT_PRECISION_ERRATA] =
+ TRUE;
+ break;
+ }
+ }
+ }
+ }
+
+ /* If there's no NPX, then we're emulating the FPU */
+ SharedUserData->ProcessorFeatures[PF_FLOATING_POINT_EMULATED] =
+ !KeI386NpxPresent;
+
+ /* Check if there's no NPX, so that we can disable associated features */
+ if (!KeI386NpxPresent)
+ {
+ /* Remove NPX-related bits */
+ KeFeatureBits &= ~(KF_XMMI64 | KF_XMMI | KF_FXSR | KF_MMX);
+
+ /* Disable kernel flags */
+ KeI386FxsrPresent = KeI386XMMIPresent = FALSE;
+
+ /* Disable processor features that might've been set until now */
+ SharedUserData->ProcessorFeatures[PF_FLOATING_POINT_PRECISION_ERRATA] =
+ SharedUserData->ProcessorFeatures[PF_XMMI64_INSTRUCTIONS_AVAILABLE] =
+ SharedUserData->ProcessorFeatures[PF_XMMI_INSTRUCTIONS_AVAILABLE] =
+ SharedUserData->ProcessorFeatures[PF_3DNOW_INSTRUCTIONS_AVAILABLE] =
+ SharedUserData->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE] = 0;
+ }
+
+ /* Check for CR4 support */
+ if (KeFeatureBits & KF_CR4)
+ {
+ /* Do an IPI call to enable the Debug Exceptions */
+ CpuCount = KeNumberProcessors;
+ KeIpiGenericCall(Ki386EnableDE, (ULONG_PTR)&CpuCount);
+ }
+
+ /* Check if FXSR was found */
+ if (KeFeatureBits & KF_FXSR)
+ {
+ /* Do an IPI call to enable the FXSR */
+ CpuCount = KeNumberProcessors;
+ KeIpiGenericCall(Ki386EnableFxsr, (ULONG_PTR)&CpuCount);
+
+ /* Check if XMM was found too */
+ if (KeFeatureBits & KF_XMMI)
+ {
+ /* Do an IPI call to enable XMMI exceptions */
+ CpuCount = KeNumberProcessors;
+ KeIpiGenericCall(Ki386EnableXMMIExceptions, (ULONG_PTR)&CpuCount);
+
+ /* FIXME: Implement and enable XMM Page Zeroing for Mm */
+
+ /* Patch the RtlPrefetchMemoryNonTemporal routine to enable it */
+ Protect = MmGetPageProtect(NULL, RtlPrefetchMemoryNonTemporal);
+ MmSetPageProtect(NULL,
+ RtlPrefetchMemoryNonTemporal,
+ Protect | PAGE_IS_WRITABLE);
+ *(PCHAR)RtlPrefetchMemoryNonTemporal = 0x90;
+ MmSetPageProtect(NULL, RtlPrefetchMemoryNonTemporal, Protect);
+ }
+ }
+
+ /* Check for, and enable SYSENTER support */
+ KiRestoreFastSyscallReturnState();
+
+ /* Loop every CPU */
+ i = KeActiveProcessors;
+ for (Affinity = 1; i; Affinity <<= 1)
+ {
+ /* Check if this is part of the set */
+ if (i & Affinity)
+ {
+ /* Run on this CPU */
+ i &= ~Affinity;
+ KeSetSystemAffinityThread(Affinity);
+
+ /* Reset MHz to 0 for this CPU */
+ KeGetCurrentPrcb()->MHz = 0;
+
+ /* Check if we can use RDTSC */
+ if (KeFeatureBits & KF_RDTSC)
+ {
+ /* Start sampling loop */
+ for (;;)
+ {
+ /* Do a dummy CPUID to start the sample */
+ CPUID(Dummy, 0);
+
+ /* Fill out the starting data */
+ CurrentSample->PerfStart = KeQueryPerformanceCounter(NULL);
+ CurrentSample->TSCStart = __rdtsc();
+ CurrentSample->PerfFreq.QuadPart = -50000;
+
+ /* Sleep for this sample */
+ KeDelayExecutionThread(KernelMode,
+ FALSE,
+ &CurrentSample->PerfFreq);
+
+ /* Do another dummy CPUID */
+ CPUID(Dummy, 0);
+
+ /* Fill out the ending data */
+ CurrentSample->PerfEnd =
+ KeQueryPerformanceCounter(&CurrentSample->PerfFreq);
+ CurrentSample->TSCEnd = __rdtsc();
+
+ /* Calculate the differences */
+ CurrentSample->PerfDelta = CurrentSample->PerfEnd.QuadPart -
+ CurrentSample->PerfStart.QuadPart;
+ CurrentSample->TSCDelta = CurrentSample->TSCEnd -
+ CurrentSample->TSCStart;
+
+ /* Compute CPU Speed */
+ CurrentSample->MHz = (ULONG)((CurrentSample->TSCDelta *
+ CurrentSample->
+ PerfFreq.QuadPart + 500000) /
+ (CurrentSample->PerfDelta *
+ 1000000));
+
+ /* Check if this isn't the first sample */
+ if (Sample)
+ {
+ /* Check if we got a good precision within 1MHz */
+ if ((CurrentSample->MHz == CurrentSample[-1].MHz) ||
+ (CurrentSample->MHz == CurrentSample[-1].MHz + 1) ||
+ (CurrentSample->MHz == CurrentSample[-1].MHz - 1))
+ {
+ /* We did, stop sampling */
+ break;
+ }
+ }
+
+ /* Move on */
+ CurrentSample++;
+ Sample++;
+
+ if (Sample == sizeof(Samples) / sizeof(Samples[0]))
+ {
+ /* Restart */
+ CurrentSample = Samples;
+ Sample = 0;
+ }
+ }
+
+ /* Save the CPU Speed */
+ KeGetCurrentPrcb()->MHz = CurrentSample[-1].MHz;
+ }
+
+ /* Check if we have MTRR */
+ if (KeFeatureBits & KF_MTRR)
+ {
+ /* Then manually initialize MTRR for the CPU */
+ KiInitializeMTRR(i ? FALSE : TRUE);
+ }
+
+ /* Check if we have AMD MTRR and initialize it for the CPU */
+ if (KeFeatureBits & KF_AMDK6MTRR) KiAmdK6InitializeMTRR();
+
+ /* Check if this is a buggy Pentium and apply the fixup if so */
+ if (KiI386PentiumLockErrataPresent) KiI386PentiumLockErrataFixup();
+
+ /* Check if the CPU supports FXSR */
+ if (KeFeatureBits & KF_FXSR)
+ {
+ /* Get the current thread NPX state */
+ FxSaveArea = (PVOID)
+ ((ULONG_PTR)KeGetCurrentThread()->InitialStack -
+ NPX_FRAME_LENGTH);
+
+ /* Clear initial MXCsr mask */
+ FxSaveArea->U.FxArea.MXCsrMask = 0;
+
+ /* Save the current NPX State */
+#ifdef __GNUC__
+ asm volatile("fxsave %0\n\t" : "=m" (*FxSaveArea));
+#else
+ __asm fxsave [FxSaveArea]
+#endif
+ /* Check if the current mask doesn't match the reserved bits */
+ if (FxSaveArea->U.FxArea.MXCsrMask != 0)
+ {
+ /* Then use whatever it's holding */
+ MXCsrMask = FxSaveArea->U.FxArea.MXCsrMask;
+ }
+
+ /* Check if nobody set the kernel-wide mask */
+ if (!KiMXCsrMask)
+ {
+ /* Then use the one we calculated above */
+ KiMXCsrMask = MXCsrMask;
+ }
+ else
+ {
+ /* Was it set to the same value we found now? */
+ if (KiMXCsrMask != MXCsrMask)
+ {
+ /* No, something is definitely wrong */
+ KEBUGCHECKEX(MULTIPROCESSOR_CONFIGURATION_NOT_SUPPORTED,
+ KF_FXSR,
+ KiMXCsrMask,
+ MXCsrMask,
+ 0);
+ }
+ }
+
+ /* Now set the kernel mask */
+ KiMXCsrMask &= MXCsrMask;
+ }
+ }
+ }
+
+ /* Return affinity back to where it was */
+ KeRevertToUserAffinityThread();
+
+ /* NT allows limiting the duration of an ISR with a registry key */
+ if (KiTimeLimitIsrMicroseconds)
+ {
+ /* FIXME: TODO */
+ DPRINT1("ISR Time Limit not yet supported\n");
+ }
+#endif
+}
+
+VOID
+NTAPI
+KiInitializePcr(IN ULONG ProcessorNumber,
+ IN PKIPCR Pcr,
+ IN PKIDTENTRY Idt,
+ IN PKGDTENTRY Gdt,
+ IN PKTSS Tss,
+ IN PKTHREAD IdleThread,
+ IN PVOID DpcStack)
+{
+#if 0
+ /* Setup the TIB */
+ Pcr->NtTib.ExceptionList = EXCEPTION_CHAIN_END;
+ Pcr->NtTib.StackBase = 0;
+ Pcr->NtTib.StackLimit = 0;
+ Pcr->NtTib.Self = NULL;
+
+ /* Set the Current Thread */
+ Pcr->PrcbData.CurrentThread = IdleThread;
+
+ /* Set pointers to ourselves */
+ Pcr->Self = (PKPCR)Pcr;
+ Pcr->Prcb = &Pcr->PrcbData;
+
+ /* Set the PCR Version */
+ Pcr->MajorVersion = PCR_MAJOR_VERSION;
+ Pcr->MinorVersion = PCR_MINOR_VERSION;
+
+ /* Set the PCRB Version */
+ Pcr->PrcbData.MajorVersion = 1;
+ Pcr->PrcbData.MinorVersion = 1;
+
+ /* Set the Build Type */
+ Pcr->PrcbData.BuildType = 0;
+#ifndef CONFIG_SMP
+ Pcr->PrcbData.BuildType |= PRCB_BUILD_UNIPROCESSOR;
+#endif
+#ifdef DBG
+ Pcr->PrcbData.BuildType |= PRCB_BUILD_DEBUG;
+#endif
+
+ /* Set the Processor Number and current Processor Mask */
+ Pcr->PrcbData.Number = (UCHAR)ProcessorNumber;
+ Pcr->PrcbData.SetMember = 1 << ProcessorNumber;
+
+ /* Set the PRCB for this Processor */
+ KiProcessorBlock[ProcessorNumber] = Pcr->Prcb;
+
+ /* Start us out at PASSIVE_LEVEL */
+ Pcr->Irql = PASSIVE_LEVEL;
+
+ /* Set the GDI, IDT, TSS and DPC Stack */
+ Pcr->GDT = (PVOID)Gdt;
+ Pcr->IDT = Idt;
+ Pcr->TSS = Tss;
+ Pcr->TssCopy = Tss;
+ Pcr->PrcbData.DpcStack = DpcStack;
+
+ /* Setup the processor set */
+ Pcr->PrcbData.MultiThreadProcessorSet = Pcr->PrcbData.SetMember;
+#endif
+}
+
+VOID
+NTAPI
+KiInitializeKernel(IN PKPROCESS InitProcess,
+ IN PKTHREAD InitThread,
+ IN PVOID IdleStack,
+ IN PKPRCB Prcb,
+ IN CCHAR Number,
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+#if 0
+ BOOLEAN NpxPresent;
+ ULONG FeatureBits;
+ LARGE_INTEGER PageDirectory;
+ PVOID DpcStack;
+ ULONG Vendor[3];
+
+ /* Detect and set the CPU Type */
+ KiSetProcessorType();
+
+ /* Set CR0 features based on detected CPU */
+ KiSetCR0Bits();
+
+ /* Check if an FPU is present */
+ NpxPresent = KiIsNpxPresent();
+
+ /* Initialize the Power Management Support for this PRCB */
+ PoInitializePrcb(Prcb);
+
+ /* Bugcheck if this is a 386 CPU */
+ if (Prcb->CpuType == 3) KeBugCheckEx(0x5D, 0x386, 0, 0, 0);
+
+ /* Get the processor features for the CPU */
+ FeatureBits = KiGetFeatureBits();
+
+ /* Set the default NX policy (opt-in) */
+ SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_OPTIN;
+
+ /* Check if NPX is always on */
+ if (strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=ALWAYSON"))
+ {
+ /* Set it always on */
+ SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_ALWAYSON;
+ FeatureBits |= KF_NX_ENABLED;
+ }
+ else if (strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=OPTOUT"))
+ {
+ /* Set it in opt-out mode */
+ SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_OPTOUT;
+ FeatureBits |= KF_NX_ENABLED;
+ }
+ else if ((strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=OPTIN")) ||
+ (strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE")))
+ {
+ /* Set the feature bits */
+ FeatureBits |= KF_NX_ENABLED;
+ }
+ else if ((strstr(KeLoaderBlock->LoadOptions, "NOEXECUTE=ALWAYSOFF")) ||
+ (strstr(KeLoaderBlock->LoadOptions, "EXECUTE")))
+ {
+ /* Set disabled mode */
+ SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_ALWAYSOFF;
+ FeatureBits |= KF_NX_DISABLED;
+ }
+
+ /* Save feature bits */
+ Prcb->FeatureBits = FeatureBits;
+
+ /* Save CPU state */
+ KiSaveProcessorControlState(&Prcb->ProcessorState);
+
+ /* Get cache line information for this CPU */
+ KiGetCacheInformation();
+
+ /* Initialize spinlocks and DPC data */
+ KiInitSpinLocks(Prcb, Number);
+
+ /* Check if this is the Boot CPU */
+ if (!Number)
+ {
+ /* Set Node Data */
+ KeNodeBlock[0] = &KiNode0;
+ Prcb->ParentNode = KeNodeBlock[0];
+ KeNodeBlock[0]->ProcessorMask = Prcb->SetMember;
+
+ /* Set boot-level flags */
+ KeI386NpxPresent = NpxPresent;
+ KeI386CpuType = Prcb->CpuType;
+ KeI386CpuStep = Prcb->CpuStep;
+ KeProcessorArchitecture = PROCESSOR_ARCHITECTURE_INTEL;
+ KeProcessorLevel = (USHORT)Prcb->CpuType;
+ if (Prcb->CpuID) KeProcessorRevision = Prcb->CpuStep;
+ KeFeatureBits = FeatureBits;
+ KeI386FxsrPresent = (KeFeatureBits & KF_FXSR) ? TRUE : FALSE;
+ KeI386XMMIPresent = (KeFeatureBits & KF_XMMI) ? TRUE : FALSE;
+
+ /* Detect 8-byte compare exchange support */
+ if (!(KeFeatureBits & KF_CMPXCHG8B))
+ {
+ /* Copy the vendor string */
+ RtlCopyMemory(Vendor, Prcb->VendorString, sizeof(Vendor));
+
+ /* Bugcheck the system. Windows *requires* this */
+ KeBugCheckEx(0x5D,
+ (1 << 24 ) | (Prcb->CpuType << 16) |
Prcb->CpuStep,
+ Vendor[0],
+ Vendor[1],
+ Vendor[2]);
+ }
+
+ /* Set the current MP Master KPRCB to the Boot PRCB */
+ Prcb->MultiThreadSetMaster = Prcb;
+
+ /* Lower to APC_LEVEL */
+ KeLowerIrql(APC_LEVEL);
+
+ /* Initialize some spinlocks */
+ KeInitializeSpinLock(&KiFreezeExecutionLock);
+ KeInitializeSpinLock(&Ki486CompatibilityLock);
+
+ /* Initialize portable parts of the OS */
+ KiInitSystem();
+
+ /* Initialize the Idle Process and the Process Listhead */
+ InitializeListHead(&KiProcessListHead);
+ PageDirectory.QuadPart = 0;
+ KeInitializeProcess(InitProcess,
+ 0,
+ 0xFFFFFFFF,
+ &PageDirectory,
+ FALSE);
+ InitProcess->QuantumReset = MAXCHAR;
+ }
+ else
+ {
+ /* FIXME */
+ DPRINT1("SMP Boot support not yet present\n");
+ }
+
+ /* Setup the Idle Thread */
+ KeInitializeThread(InitProcess,
+ InitThread,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ IdleStack);
+ InitThread->NextProcessor = Number;
+ InitThread->Priority = HIGH_PRIORITY;
+ InitThread->State = Running;
+ InitThread->Affinity = 1 << Number;
+ InitThread->WaitIrql = DISPATCH_LEVEL;
+ InitProcess->ActiveProcessors = 1 << Number;
+
+ /* HACK for MmUpdatePageDir */
+ ((PETHREAD)InitThread)->ThreadsProcess = (PEPROCESS)InitProcess;
+
+ /* Set basic CPU Features that user mode can read */
+ SharedUserData->ProcessorFeatures[PF_MMX_INSTRUCTIONS_AVAILABLE] =
+ (KeFeatureBits & KF_MMX) ? TRUE: FALSE;
+ SharedUserData->ProcessorFeatures[PF_COMPARE_EXCHANGE_DOUBLE] =
+ (KeFeatureBits & KF_CMPXCHG8B) ? TRUE: FALSE;
+ SharedUserData->ProcessorFeatures[PF_XMMI_INSTRUCTIONS_AVAILABLE] =
+ ((KeFeatureBits & KF_FXSR) && (KeFeatureBits & KF_XMMI)) ? TRUE:
FALSE;
+ SharedUserData->ProcessorFeatures[PF_XMMI64_INSTRUCTIONS_AVAILABLE] =
+ ((KeFeatureBits & KF_FXSR) && (KeFeatureBits & KF_XMMI64)) ?
TRUE: FALSE;
+ SharedUserData->ProcessorFeatures[PF_3DNOW_INSTRUCTIONS_AVAILABLE] =
+ (KeFeatureBits & KF_3DNOW) ? TRUE: FALSE;
+ SharedUserData->ProcessorFeatures[PF_RDTSC_INSTRUCTION_AVAILABLE] =
+ (KeFeatureBits & KF_RDTSC) ? TRUE: FALSE;
+
+ /* Set up the thread-related fields in the PRCB */
+ Prcb->CurrentThread = InitThread;
+ Prcb->NextThread = NULL;
+ Prcb->IdleThread = InitThread;
+
+ /* Initialize the Kernel Executive */
+ ExpInitializeExecutive(Number, LoaderBlock);
+
+ /* Only do this on the boot CPU */
+ if (!Number)
+ {
+ /* Calculate the time reciprocal */
+ KiTimeIncrementReciprocal =
+ KiComputeReciprocal(KeMaximumIncrement,
+ &KiTimeIncrementShiftCount);
+
+ /* Update DPC Values in case they got updated by the executive */
+ Prcb->MaximumDpcQueueDepth = KiMaximumDpcQueueDepth;
+ Prcb->MinimumDpcRate = KiMinimumDpcRate;
+ Prcb->AdjustDpcThreshold = KiAdjustDpcThreshold;
+
+ /* Allocate the DPC Stack */
+ DpcStack = MmCreateKernelStack(FALSE, 0);
+ if (!DpcStack) KeBugCheckEx(NO_PAGES_AVAILABLE, 1, 0, 0, 0);
+ Prcb->DpcStack = DpcStack;
+
+ /* Allocate the IOPM save area. */
+ Ki386IopmSaveArea = ExAllocatePoolWithTag(PagedPool,
+ PAGE_SIZE * 2,
+ TAG('K', 'e', '
', ' '));
+ if (!Ki386IopmSaveArea)
+ {
+ /* Bugcheck. We need this for V86/VDM support. */
+ KeBugCheckEx(NO_PAGES_AVAILABLE, 2, PAGE_SIZE * 2, 0, 0);
+ }
+ }
+
+ /* Raise to Dispatch */
+ KfRaiseIrql(DISPATCH_LEVEL);
+
+ /* Set the Idle Priority to 0. This will jump into Phase 1 */
+ KeSetPriorityThread(InitThread, 0);
+
+ /* If there's no thread scheduled, put this CPU in the Idle summary */
+ KiAcquirePrcbLock(Prcb);
+ if (!Prcb->NextThread) KiIdleSummary |= 1 << Number;
+ KiReleasePrcbLock(Prcb);
+
+ /* Raise back to HIGH_LEVEL and clear the PRCB for the loader block */
+ KfRaiseIrql(HIGH_LEVEL);
+ LoaderBlock->Prcb = 0;
+#endif
+}
+
+VOID
+FASTCALL
+KiGetMachineBootPointers(IN PKGDTENTRY *Gdt,
+ IN PKIDTENTRY *Idt,
+ IN PKIPCR *Pcr,
+ IN PKTSS *Tss)
+{
+#if 0
+ KDESCRIPTOR GdtDescriptor = {0}, IdtDescriptor = {0};
+ KGDTENTRY TssSelector, PcrSelector;
+ USHORT Tr = 0, Fs;
+
+ /* Get GDT and IDT descriptors */
+ Ke386GetGlobalDescriptorTable(*(PKDESCRIPTOR)&GdtDescriptor.Limit);
+ Ke386GetInterruptDescriptorTable(*(PKDESCRIPTOR)&IdtDescriptor.Limit);
+
+ /* Save IDT and GDT */
+ *Gdt = (PKGDTENTRY)GdtDescriptor.Base;
+ *Idt = (PKIDTENTRY)IdtDescriptor.Base;
+
+ /* Get TSS and FS Selectors */
+ Ke386GetTr(Tr);
+ if (Tr != KGDT_TSS) Tr = KGDT_TSS; // FIXME: HACKHACK
+ Fs = Ke386GetFs();
+
+ /* Get PCR Selector, mask it and get its GDT Entry */
+ PcrSelector = *(PKGDTENTRY)((ULONG_PTR)*Gdt + (Fs & ~RPL_MASK));
+
+ /* Get the KPCR itself */
+ *Pcr = (PKIPCR)(ULONG_PTR)(PcrSelector.BaseLow |
+ PcrSelector.HighWord.Bytes.BaseMid << 16 |
+ PcrSelector.HighWord.Bytes.BaseHi << 24);
+
+ /* Get TSS Selector, mask it and get its GDT Entry */
+ TssSelector = *(PKGDTENTRY)((ULONG_PTR)*Gdt + (Tr & ~RPL_MASK));
+
+ /* Get the KTSS itself */
+ *Tss = (PKTSS)(ULONG_PTR)(TssSelector.BaseLow |
+ TssSelector.HighWord.Bytes.BaseMid << 16 |
+ TssSelector.HighWord.Bytes.BaseHi << 24);
+#endif
+}
+
+VOID
+NTAPI
+KiSystemStartupReal(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+#if 0
+ ULONG Cpu;
+ PKTHREAD InitialThread;
+ ULONG InitialStack;
+ PKGDTENTRY Gdt;
+ PKIDTENTRY Idt;
+ KIDTENTRY NmiEntry, DoubleFaultEntry;
+ PKTSS Tss;
+ PKIPCR Pcr;
+
+ /* Save the loader block and get the current CPU */
+ KeLoaderBlock = LoaderBlock;
+ Cpu = KeNumberProcessors;
+ if (!Cpu)
+ {
+ /* If this is the boot CPU, set FS and the CPU Number*/
+ Ke386SetFs(KGDT_R0_PCR);
+ __writefsdword(KPCR_PROCESSOR_NUMBER, Cpu);
+
+ /* Set the initial stack and idle thread as well */
+ LoaderBlock->KernelStack = (ULONG_PTR)P0BootStack;
+ LoaderBlock->Thread = (ULONG_PTR)&KiInitialThread;
+ }
+
+ /* Save the initial thread and stack */
+ InitialStack = LoaderBlock->KernelStack;
+ InitialThread = (PKTHREAD)LoaderBlock->Thread;
+
+ /* Clean the APC List Head */
+ InitializeListHead(&InitialThread->ApcState.ApcListHead[KernelMode]);
+
+ /* Initialize the machine type */
+ KiInitializeMachineType();
+
+ /* Skip initial setup if this isn't the Boot CPU */
+ if (Cpu) goto AppCpuInit;
+
+ /* Get GDT, IDT, PCR and TSS pointers */
+ KiGetMachineBootPointers(&Gdt, &Idt, &Pcr, &Tss);
+
+ /* Setup the TSS descriptors and entries */
+ Ki386InitializeTss(Tss, Idt, Gdt);
+
+ /* Initialize the PCR */
+ RtlZeroMemory(Pcr, PAGE_SIZE);
+ KiInitializePcr(Cpu,
+ Pcr,
+ Idt,
+ Gdt,
+ Tss,
+ InitialThread,
+ KiDoubleFaultStack);
+
+ /* Set us as the current process */
+ InitialThread->ApcState.Process = &KiInitialProcess.Pcb;
+
+ /* Clear DR6/7 to cleanup bootloader debugging */
+ __writefsdword(KPCR_TEB, 0);
+ __writefsdword(KPCR_DR6, 0);
+ __writefsdword(KPCR_DR7, 0);
+
+ /* Setup the IDT */
+ KeInitExceptions();
+
+ /* Load Ring 3 selectors for DS/ES */
+ Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
+ Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
+
+ /* Save NMI and double fault traps */
+ RtlCopyMemory(&NmiEntry, &Idt[2], sizeof(KIDTENTRY));
+ RtlCopyMemory(&DoubleFaultEntry, &Idt[8], sizeof(KIDTENTRY));
+
+ /* Copy kernel's trap handlers */
+ RtlCopyMemory(Idt,
+ (PVOID)KiIdtDescriptor.Base,
+ KiIdtDescriptor.Limit + 1);
+
+ /* Restore NMI and double fault */
+ RtlCopyMemory(&Idt[2], &NmiEntry, sizeof(KIDTENTRY));
+ RtlCopyMemory(&Idt[8], &DoubleFaultEntry, sizeof(KIDTENTRY));
+
+AppCpuInit:
+ /* Loop until we can release the freeze lock */
+ do
+ {
+ /* Loop until execution can continue */
+ while (*(volatile PKSPIN_LOCK*)&KiFreezeExecutionLock == (PVOID)1);
+ } while(InterlockedBitTestAndSet((PLONG)&KiFreezeExecutionLock, 0));
+
+ /* Setup CPU-related fields */
+ __writefsdword(KPCR_NUMBER, Cpu);
+ __writefsdword(KPCR_SET_MEMBER, 1 << Cpu);
+ __writefsdword(KPCR_SET_MEMBER_COPY, 1 << Cpu);
+ __writefsdword(KPCR_PRCB_SET_MEMBER, 1 << Cpu);
+
+ /* Initialize the Processor with HAL */
+ HalInitializeProcessor(Cpu, KeLoaderBlock);
+
+ /* Set active processors */
+ KeActiveProcessors |= __readfsdword(KPCR_SET_MEMBER);
+ KeNumberProcessors++;
+
+ /* Check if this is the boot CPU */
+ if (!Cpu)
+ {
+ /* Initialize debugging system */
+ KdInitSystem(0, KeLoaderBlock);
+
+ /* Check for break-in */
+ if (KdPollBreakIn()) DbgBreakPointWithStatus(1);
+ }
+
+ /* Raise to HIGH_LEVEL */
+ KfRaiseIrql(HIGH_LEVEL);
+
+ /* Align stack and make space for the trap frame and NPX frame */
+ InitialStack &= ~(KTRAP_FRAME_ALIGN - 1);
+
+ /* Switch to new kernel stack and start kernel bootstrapping */
+ KiSetupStackAndInitializeKernel(&KiInitialProcess.Pcb,
+ InitialThread,
+ (PVOID)InitialStack,
+ (PKPRCB)__readfsdword(KPCR_PRCB),
+ (CCHAR)Cpu,
+ KeLoaderBlock);
+#endif
+}
Propchange: branches/ros-amd64-bringup/reactos/ntoskrnl/ke/amd64/kiinit.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl-generic.rbuild
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntosk…
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl-generic.rbuild [iso-8859-1]
(original)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl-generic.rbuild [iso-8859-1] Thu
Jul 24 18:04:22 2008
@@ -87,7 +87,13 @@
<file>ctxhelp.S</file>
</directory>
</if>
- <!-- file>apc.c</file -->
+ <if property="ARCH" value="amd64">
+ <directory name="amd64">
+ <file first="true">boot.S</file>
+ <file>kiinit.c</file>
+ </directory>
+ </if>
+ <file>apc.c</file>
<!-- file>balmgr.c</file -->
<!-- file>bug.c</file -->
<!-- file>clock.c</file -->
@@ -95,14 +101,14 @@
<file>devqueue.c</file>
<!-- file>dpc.c</file -->
<file>eventobj.c</file>
- <!-- file>except.c</file -->
- <!-- file>freeldr.c</file -->
- <!-- file>gate.c</file -->
- <!-- file>gmutex.c</file -->
+ <file>except.c</file>
+ <file>freeldr.c</file>
+ <file>gate.c</file>
+ <file>gmutex.c</file>
<file>ipi.c</file>
<!-- file>krnlinit.c</file -->
- <!-- file>mutex.c</file -->
- <!-- file>procobj.c</file -->
+ <file>mutex.c</file>
+ <file>procobj.c</file>
<!-- file>profobj.c</file -->
<!-- file>queue.c</file -->
<!-- file>semphobj.c</file -->
@@ -145,9 +151,9 @@
<file>cmdata.c</file>
<file>cmdelay.c</file>
<file>cmindex.c</file>
- <!-- file>cminit.c</file -->
+ <file>cminit.c</file>
<file>cmhook.c</file>
- <!-- file>cmkcbncb.c</file -->
+ <file>cmkcbncb.c</file>
<file>cmkeydel.c</file>
<file>cmlazy.c</file>
<file>cmmapvw.c</file>
@@ -155,14 +161,14 @@
<file>cmparse.c</file>
<file>cmse.c</file>
<file>cmsecach.c</file>
- <!-- file>cmsysini.c</file -->
+ <file>cmsysini.c</file>
<file>cmvalue.c</file>
<file>cmvalche.c</file>
<file>cmwraprs.c</file>
- <!-- file>ntapi.c</file -->
+ <file>ntapi.c</file>
</directory>
<directory name="dbgk">
- <!-- file>dbgkutil.c</file -->
+ <file>dbgkutil.c</file>
<!-- file>dbgkobj.c</file -->
</directory>
<directory name="ex" root="intermediate">
@@ -181,30 +187,30 @@
<file>dbgctrl.c</file>
<file>efi.c</file>
<!-- file>event.c</file -->
- <!-- file>evtpair.c</file -->
+ <file>evtpair.c</file>
<file>exintrin.c</file>
<file>fastinterlck.c</file>
<file>fmutex.c</file>
- <!-- file>handle.c</file -->
- <!-- file>harderr.c</file -->
+ <file>handle.c</file>
+ <file>harderr.c</file>
<file>hdlsterm.c</file>
<!-- file>init.c</file -->
<file>keyedevt.c</file>
- <!-- file>locale.c</file -->
+ <file>locale.c</file>
<!-- file>lookas.c</file -->
<!-- file>mutant.c</file -->
- <!-- file>pushlock.c</file -->
- <!-- file>profile.c</file -->
- <!-- file>resource.c</file -->
+ <file>pushlock.c</file>
+ <file>profile.c</file>
+ <file>resource.c</file>
<file>rundown.c</file>
<!-- file>sem.c</file -->
<file>shutdown.c</file>
<!-- file>sysinfo.c</file -->
<!-- file>time.c</file -->
<!-- file>timer.c</file -->
- <!-- file>uuid.c</file -->
+ <file>uuid.c</file>
<file>win32k.c</file>
- <!-- file>work.c</file -->
+ <file>work.c</file>
<file>xipdisp.c</file>
<file>zone.c</file>
</directory>
@@ -244,11 +250,11 @@
<file>deviface.c</file>
<file>driver.c</file>
<file>drvrlist.c</file>
- <!-- file>error.c</file -->
+ <file>error.c</file>
<!-- file>file.c</file -->
<!-- file>iocomp.c</file -->
<file>ioevent.c</file>
- <!-- file>iofunc.c</file -->
+ <file>iofunc.c</file>
<file>iomdl.c</file>
<!-- file>iomgr.c</file -->
<file>iorsrce.c</file>
@@ -261,10 +267,10 @@
<file>remlock.c</file>
<!-- file>util.c</file -->
<file>symlink.c</file>
- <!-- file>volume.c</file -->
+ <file>volume.c</file>
</directory>
<directory name="pnpmgr">
- <!-- file>plugplay.c</file -->
+ <file>plugplay.c</file>
<file>pnpdma.c</file>
<file>pnpmgr.c</file>
<file>pnpnotify.c</file>
@@ -289,17 +295,17 @@
<if property="KDBG" value="1">
<!-- file>kdb.c</file -->
<!-- file>kdb_cli.c</file -->
- <!-- file>kdb_expr.c</file -->
+ <file>kdb_expr.c</file>
<file>kdb_keyboard.c</file>
- <!-- file>kdb_serial.c</file -->
+ <file>kdb_serial.c</file>
</if>
<if property="DBG_OR_KDBG" value="true">
- <!-- file>kdb_symbols.c</file -->
+ <file>kdb_symbols.c</file>
</if>
</directory>
<directory name="kd">
<directory name="wrappers">
- <!-- file>bochs.c</file -->
+ <file>bochs.c</file>
<if property="ARCH" value="i386">
<file>gdbstub.c</file>
</if>
@@ -326,13 +332,13 @@
</if>
<directory name="lpc">
<file>close.c</file>
- <!-- file>complete.c</file -->
- <!-- file>connect.c</file -->
- <!-- file>create.c</file -->
+ <file>complete.c</file>
+ <file>connect.c</file>
+ <file>create.c</file>
<file>listen.c</file>
<file>port.c</file>
- <!-- file>reply.c</file -->
- <!-- file>send.c</file -->
+ <file>reply.c</file>
+ <file>send.c</file>
</directory>
<directory name="mm">
<if property="ARCH" value="i386">
@@ -365,8 +371,8 @@
<!-- file>mminit.c</file -->
<!-- file>mpw.c</file -->
<!-- file>ncache.c</file -->
- <!-- file>npool.c</file -->
- <!-- file>pagefile.c</file -->
+ <file>npool.c</file>
+ <file>pagefile.c</file>
<file>pageop.c</file>
<file>pager.c</file>
<file>pagfault.c</file>
@@ -374,12 +380,12 @@
<file>pe.c</file>
<file>physical.c</file>
<!-- file>pool.c</file -->
- <!-- file>ppool.c</file -->
+ <file>ppool.c</file>
<!-- file>procsup.c</file -->
<!-- file>region.c</file -->
<file>rmap.c</file>
<!-- file>section.c</file -->
- <!-- file>sysldr.c</file -->
+ <file>sysldr.c</file>
<file>verifier.c</file>
<!-- file>virtual.c</file -->
<file>wset.c</file>
@@ -391,18 +397,18 @@
<directory name="ob">
<!-- file>obdir.c</file -->
<!-- file>obinit.c</file -->
- <!-- file>obhandle.c</file -->
+ <file>obhandle.c</file>
<file>obname.c</file>
<file>oblife.c</file>
<file>obref.c</file>
- <!-- file>obsdcach.c</file -->
+ <file>obsdcach.c</file>
<file>obsecure.c</file>
- <!-- file>oblink.c</file -->
- <!-- file>obwait.c</file -->
+ <file>oblink.c</file>
+ <file>obwait.c</file>
</directory>
<directory name="po">
<file>power.c</file>
- <!-- file>events.c</file -->
+ <file>events.c</file>
</directory>
<directory name="ps">
<if property="ARCH" value="i386">
@@ -415,16 +421,16 @@
<file>psctx.c</file>
</directory>
</if>
- <!-- file>debug.c</file -->
- <!-- file>job.c</file -->
- <!-- file>kill.c</file -->
+ <file>debug.c</file>
+ <file>job.c</file>
+ <file>kill.c</file>
<file>psnotify.c</file>
- <!-- file>process.c</file -->
+ <file>process.c</file>
<!-- file>psmgr.c</file -->
- <!-- file>query.c</file -->
+ <file>query.c</file>
<file>quota.c</file>
- <!-- file>security.c</file -->
- <!-- file>state.c</file -->
+ <file>security.c</file>
+ <file>state.c</file>
<!-- file>thread.c</file -->
<!-- file>win32.c</file -->
</directory>
@@ -441,10 +447,10 @@
<directory name="se">
<file>access.c</file>
<file>acl.c</file>
- <!-- file>audit.c</file -->
- <!-- file>lsa.c</file -->
+ <file>audit.c</file>
+ <file>lsa.c</file>
<file>priv.c</file>
- <!-- file>sd.c</file -->
+ <file>sd.c</file>
<file>semgr.c</file>
<file>sid.c</file>
<!-- file>token.c</file -->
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl.rbuild
URL:
http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntosk…
==============================================================================
--- branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl.rbuild [iso-8859-1] (original)
+++ branches/ros-amd64-bringup/reactos/ntoskrnl/ntoskrnl.rbuild [iso-8859-1] Thu Jul 24
18:04:22 2008
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<!DOCTYPE module SYSTEM "../tools/rbuild/project.dtd">
<group
xmlns:xi="http://www.w3.org/2001/XInclude">
- <module name="ntoskrnl" type="kernel"
installbase="system32" installname="ntoskrnl.exe">
+ <module name="ntoskrnl" type="kernel"
installbase="system32" installname="ntoskrnl.exe"
allowwarnings="true">
<xi:include href="ntoskrnl-generic.rbuild" />
</module>
</group>