From 6b78ff036fb4f446f4e0aebe5120af26d6183a77 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Thu, 1 Mar 2018 10:36:27 +0100 Subject: [PATCH] [NTOS:KE] Don't loop indefinitely trying to figure out the CPU frequency. CORE-14419 Previously, we would keep sampling the CPU frequency until two subsequent samples differed by at most 1 MHz. This could take several seconds, and would unnecessarily delay boot. Instead, if sampling is too unreliable, just give up and calculate the average frequency from 10 samples. This is no worse than picking the frequency that just happened to be returned twice in a row. The fact that this method of sampling fails could indicate that there's a problem with our performance counter implementation or timer interrupt, but that's a separate issue... --- ntoskrnl/ke/i386/kiinit.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/ntoskrnl/ke/i386/kiinit.c b/ntoskrnl/ke/i386/kiinit.c index cba2c423fd4..c17f4dd1f35 100644 --- a/ntoskrnl/ke/i386/kiinit.c +++ b/ntoskrnl/ke/i386/kiinit.c @@ -44,7 +44,7 @@ KiInitMachineDependent(VOID) PFX_SAVE_AREA FxSaveArea; ULONG MXCsrMask = 0xFFBF; CPU_INFO CpuInfo; - KI_SAMPLE_MAP Samples[4]; + KI_SAMPLE_MAP Samples[10]; PKI_SAMPLE_MAP CurrentSample = Samples; LARGE_IDENTITY_MAP IdentityMap; @@ -240,11 +240,17 @@ KiInitMachineDependent(VOID) CurrentSample++; Sample++; - if (Sample == sizeof(Samples) / sizeof(Samples[0])) + if (Sample == RTL_NUMBER_OF(Samples)) { - /* Restart */ - CurrentSample = Samples; - Sample = 0; + /* No luck. Average the samples and be done */ + ULONG TotalMHz = 0; + while (Sample--) + { + TotalMHz += Samples[Sample].MHz; + } + CurrentSample[-1].MHz = TotalMHz / RTL_NUMBER_OF(Samples); + DPRINT1("Sampling CPU frequency failed. Using average of %lu MHz\n", CurrentSample[-1].MHz); + break; } } -- 2.17.1