Author: ion Date: Sat Sep 30 10:18:45 2006 New Revision: 24307
URL: http://svn.reactos.org/svn/reactos?rev=24307&view=rev Log: - Add loop around the KiFreezeExecutionLock before continuing OS boot. - Only check for break-in on the Boot CPU. - Set priority to 0 *Before* lowering to DISPATCH_LEVEL. - Also force interrupts to be enabled before lowering IRQL. - Also set the idle thread's wait irql to DISPATCH_LEVEL (might fix some odd crashes) and set it as Running on UP builds (on SMP builds this is done in other code).
Modified: trunk/reactos/ntoskrnl/ke/i386/kiinit.c
Modified: trunk/reactos/ntoskrnl/ke/i386/kiinit.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/kiinit.c?r... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/kiinit.c (original) +++ trunk/reactos/ntoskrnl/ke/i386/kiinit.c Sat Sep 30 10:18:45 2006 @@ -335,8 +335,15 @@ Ke386SetDs(KGDT_R3_DATA | RPL_MASK); Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
+AppCpuInit: + /* Loop until we can release the freeze lock */ + do + { + /* Loop until execution can continue */ + while (KiFreezeExecutionLock == 1); + } while(InterlockedBitTestAndSet(&KiFreezeExecutionLock, 0)); + /* Setup CPU-related fields */ -AppCpuInit: __writefsdword(KPCR_NUMBER, Cpu); __writefsdword(KPCR_SET_MEMBER, 1 << Cpu); __writefsdword(KPCR_SET_MEMBER_COPY, 1 << Cpu); @@ -349,11 +356,15 @@ KeActiveProcessors |= Pcr->SetMember; KeNumberProcessors++;
- /* Initialize the Debugger for the Boot CPU */ - if (!Cpu) KdInitSystem (0, KeLoaderBlock); - - /* Check for break-in */ - if (KdPollBreakIn()) DbgBreakPointWithStatus(1); + /* 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); @@ -366,11 +377,20 @@ Cpu, LoaderBlock);
- /* Lower IRQL back to DISPATCH_LEVEL */ - KfLowerIrql(DISPATCH_LEVEL); - /* Set the priority of this thread to 0 */ KeGetCurrentThread()->Priority = 0; + + /* Force interrupts enabled and lower IRQL back to DISPATCH_LEVEL */ + _enable(); + KfLowerIrql(DISPATCH_LEVEL); + + /* Set the right wait IRQL */ + KeGetCurrentThread()->WaitIrql = DISPATCH_LEVEL; + + /* Set idle thread as running on UP builds */ +#ifndef CONFIG_SMP + KeGetCurrentThread()->State = Running; +#endif
/* Jump into the idle loop */ KiIdleLoop();