mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 05:45:41 +00:00
- Implement HalProcessorIdle.
- Fix KiIdleLoop to actuall load the PCR in EBX. It was using a completely random value. - Call the Processor Idle Routine now, isntead of hard-coding STI+HLT. This routine had already been setup during bootup by PoInitailizePrcb. - Implemented PopIdle0 and made it call HalProcessorIdle. No performance/throttling is done yet. svn path=/trunk/; revision=24063
This commit is contained in:
parent
81997fc0bc
commit
c19a362969
6 changed files with 26 additions and 20 deletions
|
@ -45,18 +45,6 @@ HalHandleNMI(PVOID NmiInfo)
|
||||||
KeEnterKernelDebugger ();
|
KeEnterKernelDebugger ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VOID STDCALL
|
|
||||||
HalProcessorIdle(VOID)
|
|
||||||
{
|
|
||||||
#if 1
|
|
||||||
Ki386EnableInterrupts();
|
|
||||||
Ki386HaltProcessor();
|
|
||||||
#else
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG FASTCALL
|
ULONG FASTCALL
|
||||||
HalSystemVectorDispatchEntry (
|
HalSystemVectorDispatchEntry (
|
||||||
ULONG Unknown1,
|
ULONG Unknown1,
|
||||||
|
|
|
@ -47,4 +47,12 @@ HalStartNextProcessor(ULONG Unknown1,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
HalProcessorIdle(VOID)
|
||||||
|
{
|
||||||
|
Ki386EnableInterrupts();
|
||||||
|
Ki386HaltProcessor();
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -176,6 +176,7 @@ Author:
|
||||||
#define KPCR_PRCB_TIMER_REQUEST 0xA88
|
#define KPCR_PRCB_TIMER_REQUEST 0xA88
|
||||||
#define KPCR_PRCB_QUANTUM_END 0xAA1
|
#define KPCR_PRCB_QUANTUM_END 0xAA1
|
||||||
#define KPCR_PRCB_DEFERRED_READY_LIST_HEAD 0xC10
|
#define KPCR_PRCB_DEFERRED_READY_LIST_HEAD 0xC10
|
||||||
|
#define KPCR_PRCB_POWER_STATE_IDLE_FUNCTION 0xEC0
|
||||||
|
|
||||||
//
|
//
|
||||||
// KINTERRUPT Offsets
|
// KINTERRUPT Offsets
|
||||||
|
|
|
@ -88,6 +88,16 @@ HalStartNextProcessor(
|
||||||
ULONG Unknown2
|
ULONG Unknown2
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//
|
||||||
|
// CPU Routines
|
||||||
|
//
|
||||||
|
NTHALAPI
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
HalProcessorIdle(
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Interrupt Functions
|
// Interrupt Functions
|
||||||
//
|
//
|
||||||
|
|
|
@ -518,18 +518,16 @@ BugCheckDpc:
|
||||||
.func @KiIdleLoop@0, @KiIdleLoop@0
|
.func @KiIdleLoop@0, @KiIdleLoop@0
|
||||||
@KiIdleLoop@0:
|
@KiIdleLoop@0:
|
||||||
|
|
||||||
|
/* Set EBX */
|
||||||
|
mov ebx, fs:[KPCR_SELF]
|
||||||
|
|
||||||
/* Jump into mainline code */
|
/* Jump into mainline code */
|
||||||
jmp MainLoop
|
jmp MainLoop
|
||||||
|
|
||||||
CpuIdle:
|
CpuIdle:
|
||||||
/* Call the CPU's idle function */
|
/* Call the CPU's idle function */
|
||||||
#if 0
|
|
||||||
lea ecx, [ebx+KPCR_PRCB_POWER_STATE_IDLE_FUNCTION]
|
lea ecx, [ebx+KPCR_PRCB_POWER_STATE_IDLE_FUNCTION]
|
||||||
call [ecx]
|
call [ecx]
|
||||||
#else
|
|
||||||
sti
|
|
||||||
hlt
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MainLoop:
|
MainLoop:
|
||||||
/* Cycle interrupts for 1 cycle */
|
/* Cycle interrupts for 1 cycle */
|
||||||
|
|
|
@ -340,9 +340,10 @@ PopPerfIdleDpc(IN PKDPC Dpc,
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
FASTCALL
|
FASTCALL
|
||||||
PopIdle0(IN PKPRCB Prcb)
|
PopIdle0(IN PPROCESSOR_POWER_STATE PowerState)
|
||||||
{
|
{
|
||||||
DPRINT1("Idle function: %p\n", Prcb);
|
/* FIXME: Extremly naive implementation */
|
||||||
|
HalProcessorIdle();
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -358,7 +359,7 @@ PoInitializePrcb(IN PKPRCB Prcb)
|
||||||
|
|
||||||
/* Initialize the Perf DPC and Timer */
|
/* Initialize the Perf DPC and Timer */
|
||||||
KeInitializeDpc(&Prcb->PowerState.PerfDpc, PopPerfIdleDpc, Prcb);
|
KeInitializeDpc(&Prcb->PowerState.PerfDpc, PopPerfIdleDpc, Prcb);
|
||||||
//KeSetTargetProcessorDpc(&Prcb->PowerState.PerfDpc, Prcb->Number);
|
KeSetTargetProcessorDpc(&Prcb->PowerState.PerfDpc, Prcb->Number);
|
||||||
KeInitializeTimerEx(&Prcb->PowerState.PerfTimer, SynchronizationTimer);
|
KeInitializeTimerEx(&Prcb->PowerState.PerfTimer, SynchronizationTimer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue