internal static void ApicTimer(PMTimer pmTimer, ApicTimer apicTimer) { apicTimer.SetDivisor(1); apicTimer.SetOneShot(); apicTimer.SetInterruptEnabled(false); apicTimer.SetInitialCount(~0u); uint apicLast = apicTimer.Value; uint pmLast = pmTimer.Value; uint pmLimit = PMTimer.FrequencyHz / 15; uint pmAccum = 0; uint apicNow = 0; // Initial measurements apicLast = apicTimer.Value; pmLast = pmTimer.Value; do { apicNow = apicTimer.Value; uint pmNow = pmTimer.Value | 0xff000000; pmAccum += PmDelta(pmNow, pmLast); pmLast = pmNow; } while (pmAccum < pmLimit); ulong apicHz = PMTimer.FrequencyHz * (ulong)(apicLast - apicNow) / pmAccum; DebugStub.Print("Cpu{0}: APIC timer frequency {1} Hz\n", __arglist(Processor.CurrentProcessor.Id, apicHz)); apicTimer.SetBusFrequency((uint)apicHz); }