X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Ftime.c;h=35852a61cdfe07b2e8d6d55fe18b1951b45f08ee;hb=12e3e312b1c9ea83342a504786e0eb36ede2d9d5;hp=bfc48ce0671c5473344151203ca761afe68d3548;hpb=38e0413b2a7bf39a18045e6c6f528655f8354652;p=vpp.git 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);