From eeeb9d6ed7d043a27015904ff4c59baa50b8315b Mon Sep 17 00:00:00 2001 From: Rafal Kupiec Date: Thu, 9 May 2024 22:12:50 +0200 Subject: [PATCH] Update PoInitializeProcessorControlBlock() routine and corresponding structures --- sdk/xtdk/potypes.h | 63 +++++++++++++++++++++++++++++++++++++++++++++- xtoskrnl/po/idle.c | 1 + 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/sdk/xtdk/potypes.h b/sdk/xtdk/potypes.h index e918686..d07e10a 100644 --- a/sdk/xtdk/potypes.h +++ b/sdk/xtdk/potypes.h @@ -15,16 +15,77 @@ /* Power Manager routine callbacks */ -typedef VOID (XTFASTCALL *PPROCESSOR_IDLE_FUNCTION)(PPROCESSOR_POWER_STATE PowerState); +typedef VOID (XTFASTCALL *PPROCESSOR_IDLE_FUNCTION)(IN PPROCESSOR_POWER_STATE PowerState); +typedef XTSTATUS (XTFASTCALL *PSET_PROCESSOR_THROTTLE)(IN UCHAR Throttle); + +/* Processor IDLE times structure definition */ +typedef struct _PROCESSOR_IDLE_TIMES +{ + ULONGLONG StartTime; + ULONGLONG EndTime; + ULONG IdleHandlerReserved[4]; +} PROCESSOR_IDLE_TIMES, *PPROCESSOR_IDLE_TIMES; + +/* Processor performance state structure definition */ +typedef struct _PROCESSOR_PERF_STATE +{ + UCHAR PercentFrequency; + UCHAR MinCapacity; + USHORT Power; + UCHAR IncreaseLevel; + UCHAR DecreaseLevel; + USHORT Flags; + ULONG IncreaseTime; + ULONG DecreaseTime; + ULONG IncreaseCount; + ULONG DecreaseCount; + ULONGLONG PerformanceTime; +} PROCESSOR_PERF_STATE, *PPROCESSOR_PERF_STATE; /* Processor power state structure definition */ typedef struct _PROCESSOR_POWER_STATE { PPROCESSOR_IDLE_FUNCTION IdleFunction; ULONG Idle0TimeLimit; + ULONG Idle0LastTime; + PVOID IdleHandlers; + PVOID IdleState; + ULONG IdleHandlersCount; + ULONGLONG LastCheck; + PROCESSOR_IDLE_TIMES IdleTimes; + ULONG IdleTime1; + ULONG PromotionCheck; + ULONG IdleTime2; UCHAR CurrentThrottle; + UCHAR ThermalThrottleLimit; + UCHAR CurrentThrottleIndex; + UCHAR ThermalThrottleIndex; + ULONG PerfSystemTime; + ULONG PerfIdleTime; + ULONG LastSysTime; + ULONGLONG TotalIdleStateTime[3]; + ULONG TotalIdleTransitions[3]; + ULONGLONG PreviousC3StateTime; + UCHAR KneeThrottleIndex; + UCHAR ThrottleLimitIndex; + UCHAR PerfStatesCount; + UCHAR ProcessorMinThrottle; + UCHAR ProcessorMaxThrottle; + UCHAR LastBusyPercentage; + UCHAR LastC3Percentage; + UCHAR LastAdjustedBusyPercentage; + ULONG PromotionCount; + ULONG DemotionCount; + ULONG ErrorCount; + ULONG RetryCount; + ULONG Flags; + LARGE_INTEGER PerfCounterFrequency; + ULONG PerfTickCount; KTIMER PerfTimer; KDPC PerfDpc; + PPROCESSOR_PERF_STATE PerfStates; + PSET_PROCESSOR_THROTTLE PerfSetThrottle; + ULONG LastC3UserTime; } PROCESSOR_POWER_STATE, *PPROCESSOR_POWER_STATE; #endif /* __XTDK_POTYPES_H */ diff --git a/xtoskrnl/po/idle.c b/xtoskrnl/po/idle.c index f00208e..9fad09b 100644 --- a/xtoskrnl/po/idle.c +++ b/xtoskrnl/po/idle.c @@ -29,6 +29,7 @@ PoInitializeProcessorControlBlock(IN OUT PKPROCESSOR_CONTROL_BLOCK Prcb) /* Initialize default power state */ Prcb->PowerState.Idle0TimeLimit = 0xFFFFFFFF; Prcb->PowerState.CurrentThrottle = 100; + Prcb->PowerState.CurrentThrottleIndex = 0; Prcb->PowerState.IdleFunction = PopIdle0Function; /* Initialize DPC and Timer */