vppinfra: use CPUID provided base frequency if available

Type: fix

Change-Id: Ifb007207be97119e07c3a0eba4714eb519de043c
Signed-off-by: Damjan Marion <damarion@cisco.com>
This commit is contained in:
Damjan Marion
2019-12-18 18:45:19 +01:00
committed by Damjan Marion
parent 38e0413b2a
commit 12e3e312b1

View File

@@ -153,6 +153,38 @@ os_cpu_clock_frequency (void)
#endif
f64 cpu_freq;
#ifdef __x86_64__
u32 __clib_unused eax = 0, ebx = 0, ecx = 0, edx = 0;
clib_get_cpuid (0x00, &eax, &ebx, &ecx, &edx);
if (eax >= 0x15)
{
u32 max_leaf = eax;
/*
CPUID Leaf 0x15 - Time Stamp Counter and Nominal Core Crystal Clock Info
eax - denominator of the TSC/”core crystal clock” ratio
ebx - numerator of the TSC/”core crystal clock” ratio
ecx - nominal frequency of the core crystal clock in Hz
edx - reseved
*/
clib_get_cpuid (0x15, &eax, &ebx, &ecx, &edx);
if (ebx && ecx)
return ecx * ebx / eax;
if (max_leaf >= 0x16)
{
/*
CPUID Leaf 0x16 - Processor Frequency Information Leaf
eax - Bits 15 - 00: Processor Base Frequency (in MHz).
*/
clib_get_cpuid (0x16, &eax, &ebx, &ecx, &edx);
if (eax)
return 1e6 * (eax & 0xffff);
}
}
#endif
if (clib_cpu_supports_invariant_tsc ())
return estimate_clock_frequency (1e-3);