Module Name:    src
Committed By:   martin
Date:           Sat Oct 15 10:20:32 UTC 2022

Modified Files:
        src/sys/dev/tprof [netbsd-9]: tprof_x86_intel.c
        src/usr.sbin/tprof/arch [netbsd-9]: tprof_x86.c

Log Message:
Pull up following revision(s) (requested by msaitoh in ticket #1543):

        sys/dev/tprof/tprof_x86_intel.c: revision 1.4
        usr.sbin/tprof/arch/tprof_x86.c: revision 1.10
        usr.sbin/tprof/arch/tprof_x86.c: revision 1.11
        usr.sbin/tprof/arch/tprof_x86.c: revision 1.12

Fix typo in a comment.

Use CPUID_PERF_* macros defined in specialreg.h. No functional change.

Add topdown-slots to Intel architectural performance monitoring version 1.

Disable the unsupported events from the bit vector length in EAX.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.3.2.1 src/sys/dev/tprof/tprof_x86_intel.c
cvs rdiff -u -r1.8.4.1 -r1.8.4.2 src/usr.sbin/tprof/arch/tprof_x86.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/tprof/tprof_x86_intel.c
diff -u src/sys/dev/tprof/tprof_x86_intel.c:1.3 src/sys/dev/tprof/tprof_x86_intel.c:1.3.2.1
--- src/sys/dev/tprof/tprof_x86_intel.c:1.3	Fri Jun 14 11:50:35 2019
+++ src/sys/dev/tprof/tprof_x86_intel.c	Sat Oct 15 10:20:32 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: tprof_x86_intel.c,v 1.3 2019/06/14 11:50:35 msaitoh Exp $	*/
+/*	$NetBSD: tprof_x86_intel.c,v 1.3.2.1 2022/10/15 10:20:32 martin Exp $	*/
 
 /*
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -56,7 +56,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tprof_x86_intel.c,v 1.3 2019/06/14 11:50:35 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tprof_x86_intel.c,v 1.3.2.1 2022/10/15 10:20:32 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -90,10 +90,6 @@ __KERNEL_RCSID(0, "$NetBSD: tprof_x86_in
 #define	PERFEVTSEL_INV		__BIT(23)
 #define	PERFEVTSEL_COUNTER_MASK	__BITS(24, 31)
 
-#define CPUID_0A_VERSION	__BITS(0, 7)
-#define CPUID_0A_NCOUNTERS	__BITS(8, 15)
-#define CPUID_0A_BITWIDTH	__BITS(16, 23)
-
 static uint64_t counter_bitwidth;
 static uint64_t counter_val = 5000000;
 static uint64_t counter_reset_val;
@@ -195,14 +191,14 @@ tprof_intel_ident(void)
 		return TPROF_IDENT_NONE;
 	}
 	x86_cpuid(0x0A, descs);
-	if ((descs[0] & CPUID_0A_VERSION) == 0) {
+	if ((descs[0] & CPUID_PERF_VERSION) == 0) {
 		return TPROF_IDENT_NONE;
 	}
-	if ((descs[0] & CPUID_0A_NCOUNTERS) == 0) {
+	if ((descs[0] & CPUID_PERF_NGPPC) == 0) {
 		return TPROF_IDENT_NONE;
 	}
 
-	counter_bitwidth = __SHIFTOUT(descs[0], CPUID_0A_BITWIDTH);
+	counter_bitwidth = __SHIFTOUT(descs[0], CPUID_PERF_NBWGPPC);
 
 	return TPROF_IDENT_INTEL_GENERIC;
 }

Index: src/usr.sbin/tprof/arch/tprof_x86.c
diff -u src/usr.sbin/tprof/arch/tprof_x86.c:1.8.4.1 src/usr.sbin/tprof/arch/tprof_x86.c:1.8.4.2
--- src/usr.sbin/tprof/arch/tprof_x86.c:1.8.4.1	Sat Oct 12 14:34:45 2019
+++ src/usr.sbin/tprof/arch/tprof_x86.c	Sat Oct 15 10:20:32 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: tprof_x86.c,v 1.8.4.1 2019/10/12 14:34:45 martin Exp $	*/
+/*	$NetBSD: tprof_x86.c,v 1.8.4.2 2022/10/15 10:20:32 martin Exp $	*/
 
 /*
  * Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
@@ -85,6 +85,7 @@ static struct name_to_event intel_arch1_
 	{ "llc-misses",			0x2E, 0x41, true },
 	{ "branch-instruction-retired",	0xC4, 0x00, true },
 	{ "branch-misses-retired",	0xC5, 0x00, true },
+	{ "topdown-slots",		0xA4, 0x01, true },
 };
 
 static struct event_table intel_arch1 = {
@@ -98,7 +99,7 @@ static struct event_table intel_arch1 = 
 static struct event_table *
 init_intel_arch1(void)
 {
-	unsigned int eax, ebx, ecx, edx;
+	unsigned int eax, ebx, ecx, edx, vectorlen;
 	struct event_table *table;
 	size_t i;
 
@@ -108,9 +109,17 @@ init_intel_arch1(void)
 	edx = 0;
 	x86_cpuid(&eax, &ebx, &ecx, &edx);
 
+	vectorlen = __SHIFTOUT(eax, CPUID_PERF_BVECLEN);
+
 	table = &intel_arch1;
 	for (i = 0; i < table->nevents; i++) {
-		/* Disable the unsupported events. */
+		/*
+		 * Disable the unsupported events from:
+		 * a) the bit vector length in EAX.
+		 * b) the disable bit in EBX.
+		 */
+		if (i >= vectorlen)
+			table->names[i].enabled = false;
 		if ((ebx & (i << 1)) != 0)
 			table->names[i].enabled = false;
 	}
@@ -550,7 +559,7 @@ init_intel_generic(void)
 			table->next = init_intel_silvermont_airmont();
 			break;
 		case 0x5C: /* Goldmont (Apollo Lake) */
-		case 0x5F: /* Goldmont (Denvertion) */
+		case 0x5F: /* Goldmont (Denverton) */
 			table->next = init_intel_goldmont();
 			break;
 		case 0x7A: /* Goldmont Plus (Gemini Lake) */

Reply via email to