mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 19:26:32 +00:00
- 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 svn path=/branches/ros-amd64-bringup/; revision=34765
This commit is contained in:
@@ -0,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@relsoft.net)
|
||||
* Thomas Weidenmueller <w3seek@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
|
||||
@@ -0,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 ([email protected])
|
||||
*/
|
||||
|
||||
/* 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
|
||||
}
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user