mirror of
https://github.com/reactos/reactos.git
synced 2024-10-05 08:54:40 +00:00
- 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). svn path=/trunk/; revision=24307
This commit is contained in:
parent
eb0f964be3
commit
f516d2846e
|
@ -335,8 +335,15 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
|
||||||
Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
|
Ke386SetDs(KGDT_R3_DATA | RPL_MASK);
|
||||||
Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
|
Ke386SetEs(KGDT_R3_DATA | RPL_MASK);
|
||||||
|
|
||||||
/* Setup CPU-related fields */
|
|
||||||
AppCpuInit:
|
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 */
|
||||||
__writefsdword(KPCR_NUMBER, Cpu);
|
__writefsdword(KPCR_NUMBER, Cpu);
|
||||||
__writefsdword(KPCR_SET_MEMBER, 1 << Cpu);
|
__writefsdword(KPCR_SET_MEMBER, 1 << Cpu);
|
||||||
__writefsdword(KPCR_SET_MEMBER_COPY, 1 << Cpu);
|
__writefsdword(KPCR_SET_MEMBER_COPY, 1 << Cpu);
|
||||||
|
@ -349,11 +356,15 @@ AppCpuInit:
|
||||||
KeActiveProcessors |= Pcr->SetMember;
|
KeActiveProcessors |= Pcr->SetMember;
|
||||||
KeNumberProcessors++;
|
KeNumberProcessors++;
|
||||||
|
|
||||||
/* Initialize the Debugger for the Boot CPU */
|
/* Check if this is the boot CPU */
|
||||||
if (!Cpu) KdInitSystem (0, KeLoaderBlock);
|
if (!Cpu)
|
||||||
|
{
|
||||||
|
/* Initialize debugging system */
|
||||||
|
KdInitSystem (0, KeLoaderBlock);
|
||||||
|
|
||||||
/* Check for break-in */
|
/* Check for break-in */
|
||||||
if (KdPollBreakIn()) DbgBreakPointWithStatus(1);
|
if (KdPollBreakIn()) DbgBreakPointWithStatus(1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Raise to HIGH_LEVEL */
|
/* Raise to HIGH_LEVEL */
|
||||||
KfRaiseIrql(HIGH_LEVEL);
|
KfRaiseIrql(HIGH_LEVEL);
|
||||||
|
@ -366,12 +377,21 @@ AppCpuInit:
|
||||||
Cpu,
|
Cpu,
|
||||||
LoaderBlock);
|
LoaderBlock);
|
||||||
|
|
||||||
/* Lower IRQL back to DISPATCH_LEVEL */
|
|
||||||
KfLowerIrql(DISPATCH_LEVEL);
|
|
||||||
|
|
||||||
/* Set the priority of this thread to 0 */
|
/* Set the priority of this thread to 0 */
|
||||||
KeGetCurrentThread()->Priority = 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 */
|
/* Jump into the idle loop */
|
||||||
KiIdleLoop();
|
KiIdleLoop();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue