diff --git a/sys/amd64/amd64/identcpu.c b/sys/amd64/amd64/identcpu.c index bfb2c16afc89..c1e0220a0ba1 100644 --- a/sys/amd64/amd64/identcpu.c +++ b/sys/amd64/amd64/identcpu.c @@ -396,8 +396,11 @@ printcpuinfo(void) * If this CPU supports P-state invariant TSC then * mention the capability. */ - if (tsc_is_invariant) + if (tsc_is_invariant) { printf("\n TSC: P-state invariant"); + if (tsc_perf_stat) + printf(", performance statistics"); + } } } diff --git a/sys/i386/i386/identcpu.c b/sys/i386/i386/identcpu.c index 8760562f832f..59b4b9cb29c2 100644 --- a/sys/i386/i386/identcpu.c +++ b/sys/i386/i386/identcpu.c @@ -873,8 +873,11 @@ printcpuinfo(void) * If this CPU supports P-state invariant TSC then * mention the capability. */ - if (tsc_is_invariant) + if (tsc_is_invariant) { printf("\n TSC: P-state invariant"); + if (tsc_perf_stat) + printf(", performance statistics"); + } } } else if (cpu_vendor_id == CPU_VENDOR_CYRIX) { diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c index be691f9ed903..7aca10f4432e 100644 --- a/sys/x86/x86/tsc.c +++ b/sys/x86/x86/tsc.c @@ -49,6 +49,8 @@ __FBSDID("$FreeBSD$"); uint64_t tsc_freq; int tsc_is_invariant; +int tsc_perf_stat; + static eventhandler_tag tsc_levels_tag, tsc_pre_tag, tsc_post_tag; SYSCTL_INT(_kern_timecounter, OID_AUTO, invariant_tsc, CTLFLAG_RDTUN, @@ -151,6 +153,7 @@ tsc_freq_intel(void) static void probe_tsc_freq(void) { + u_int regs[4]; uint64_t tsc1, tsc2; switch (cpu_vendor_id) { @@ -178,6 +181,12 @@ probe_tsc_freq(void) break; } + if (cpu_high >= 6) { + do_cpuid(6, regs); + if ((regs[2] & CPUID_PERF_STAT) != 0) + tsc_perf_stat = 1; + } + if (tsc_skip_calibration) { if (cpu_vendor_id == CPU_VENDOR_INTEL) tsc_freq_intel();