Author: ion
Date: Sat Sep 30 11:04:49 2006
New Revision: 24308
URL:
http://svn.reactos.org/svn/reactos?rev=24308&view=rev
Log:
- Save processor state in the PKPRCB in KiInitializeKernel.
- Set the booting CPU as idle if no next thread was scheduled.
- Raise IRQL to HIGH_LEVEL upon exiting KiInitializeKernel to match the re-lowering to
DISPATCH_LEVEL in KiSystemStartup (and subsequent interrupt flush).
Modified:
trunk/reactos/ntoskrnl/include/internal/i386/ke.h
trunk/reactos/ntoskrnl/ke/i386/kiinit.c
Modified: trunk/reactos/ntoskrnl/include/internal/i386/ke.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/i386/ke.h (original)
+++ trunk/reactos/ntoskrnl/include/internal/i386/ke.h Sat Sep 30 11:04:49 2006
@@ -65,6 +65,16 @@
);
VOID
+NTAPI
+KiSaveProcessorControlState(
+ IN PKPROCESSOR_STATE ProcessorState
+);
+
+VOID
+FASTCALL
+KiIdleLoop(VOID);
+
+VOID
KiGdtPrepareForApplicationProcessorInit(ULONG Id);
VOID
Ki386InitializeLdt(VOID);
Modified: trunk/reactos/ntoskrnl/ke/i386/kiinit.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/kiinit.c?…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/i386/kiinit.c (original)
+++ trunk/reactos/ntoskrnl/ke/i386/kiinit.c Sat Sep 30 11:04:49 2006
@@ -14,10 +14,6 @@
#include <intrin.h>
/* GLOBALS *******************************************************************/
-
-VOID
-FASTCALL
-KiIdleLoop(VOID);
/* Spinlocks used only on X86 */
KSPIN_LOCK KiFreezeExecutionLock;
@@ -111,6 +107,9 @@
/* Save feature bits */
Prcb->FeatureBits = FeatureBits;
+ /* Save CPU state */
+ KiSaveProcessorControlState(&Prcb->ProcessorState);
+
/* Get cache line information for this CPU */
KiGetCacheInformation();
@@ -226,10 +225,17 @@
/* 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 */
+ if (!Prcb->NextThread) KiIdleSummary |= 1 << Number;
+
+ /* Raise back to HIGH_LEVEL and clear the PRCB for the loader block */
+ KfRaiseIrql(HIGH_LEVEL);
+ LoaderBlock->Prcb = 0;
}
VOID
-NTAPI
+FASTCALL
KiGetMachineBootPointers(IN PKGDTENTRY *Gdt,
IN PKIDTENTRY *Idt,
IN PKIPCR *Pcr,