From 12e3e312b1c9ea83342a504786e0eb36ede2d9d5 Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Wed, 18 Dec 2019 18:45:19 +0100 Subject: vppinfra: use CPUID provided base frequency if available Type: fix Change-Id: Ifb007207be97119e07c3a0eba4714eb519de043c Signed-off-by: Damjan Marion --- src/vppinfra/time.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/vppinfra/time.c') diff --git a/src/vppinfra/time.c b/src/vppinfra/time.c index bfc48ce0671..35852a61cdf 100644 --- a/src/vppinfra/time.c +++ b/src/vppinfra/time.c @@ -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); -- cgit 1.2.3-korg