summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamjan Marion <damarion@cisco.com>2019-12-18 18:45:19 +0100
committerDamjan Marion <dmarion@me.com>2020-01-27 21:06:14 +0000
commit12e3e312b1c9ea83342a504786e0eb36ede2d9d5 (patch)
tree6416f2894f0c421414d04c4ec925bedc40e3a55d
parent38e0413b2a7bf39a18045e6c6f528655f8354652 (diff)
vppinfra: use CPUID provided base frequency if available
Type: fix Change-Id: Ifb007207be97119e07c3a0eba4714eb519de043c Signed-off-by: Damjan Marion <damarion@cisco.com>
-rw-r--r--src/vppinfra/time.c32
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);