diff options
author | Damjan Marion <damarion@cisco.com> | 2019-12-18 18:45:19 +0100 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2020-01-27 21:06:14 +0000 |
commit | 12e3e312b1c9ea83342a504786e0eb36ede2d9d5 (patch) | |
tree | 6416f2894f0c421414d04c4ec925bedc40e3a55d /src/vppinfra/time.c | |
parent | 38e0413b2a7bf39a18045e6c6f528655f8354652 (diff) |
vppinfra: use CPUID provided base frequency if available
Type: fix
Change-Id: Ifb007207be97119e07c3a0eba4714eb519de043c
Signed-off-by: Damjan Marion <damarion@cisco.com>
Diffstat (limited to 'src/vppinfra/time.c')
-rw-r--r-- | src/vppinfra/time.c | 32 |
1 files changed, 32 insertions, 0 deletions
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); |