Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Apr 2011 22:15:46 +0000 (UTC)
From:      Jung-uk Kim <jkim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r220579 - in head/sys: amd64/amd64 i386/i386 x86/x86
Message-ID:  <201104122215.p3CMFkCZ037196@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jkim
Date: Tue Apr 12 22:15:46 2011
New Revision: 220579
URL: http://svn.freebsd.org/changeset/base/220579

Log:
  Probe capability to find effective frequency.  When the TSC is P-state
  invariant, APERF/MPERF ratio can be used to find effective frequency.

Modified:
  head/sys/amd64/amd64/identcpu.c
  head/sys/i386/i386/identcpu.c
  head/sys/x86/x86/tsc.c

Modified: head/sys/amd64/amd64/identcpu.c
==============================================================================
--- head/sys/amd64/amd64/identcpu.c	Tue Apr 12 22:12:23 2011	(r220578)
+++ head/sys/amd64/amd64/identcpu.c	Tue Apr 12 22:15:46 2011	(r220579)
@@ -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");
+			}
 
 		}
 	}

Modified: head/sys/i386/i386/identcpu.c
==============================================================================
--- head/sys/i386/i386/identcpu.c	Tue Apr 12 22:12:23 2011	(r220578)
+++ head/sys/i386/i386/identcpu.c	Tue Apr 12 22:15:46 2011	(r220579)
@@ -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) {

Modified: head/sys/x86/x86/tsc.c
==============================================================================
--- head/sys/x86/x86/tsc.c	Tue Apr 12 22:12:23 2011	(r220578)
+++ head/sys/x86/x86/tsc.c	Tue Apr 12 22:15:46 2011	(r220579)
@@ -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();



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201104122215.p3CMFkCZ037196>