svn commit: r183725 - in head: lib/libpmc sys/dev/hwpmc sys/sys

Joseph Koshy jkoshy at FreeBSD.org
Thu Oct 9 14:55:46 UTC 2008


Author: jkoshy
Date: Thu Oct  9 14:55:45 2008
New Revision: 183725
URL: http://svn.freebsd.org/changeset/base/183725

Log:
  - Sparsely number enumerations 'pmc_cputype' and 'pmc_event' in order to
    reduce ABI disruptions when new cpu types and new PMC events are added
    in the future.
  - Support alternate spellings for PMC events.  Derive the canonical
    spelling of an event name from its enumeration name in 'enum pmc_event'.
  - Provide a way for users to disambiguate between identically named events
    supported by multiple classes of PMCs in a CPU.
  - Change libpmc's machine-dependent event specifier parsing code to
    better support CPUs containing two or more classes of PMC resources.

Modified:
  head/lib/libpmc/libpmc.c
  head/sys/dev/hwpmc/pmc_events.h
  head/sys/sys/pmc.h

Modified: head/lib/libpmc/libpmc.c
==============================================================================
--- head/lib/libpmc/libpmc.c	Thu Oct  9 12:56:57 2008	(r183724)
+++ head/lib/libpmc/libpmc.c	Thu Oct  9 14:55:45 2008	(r183725)
@@ -59,6 +59,10 @@ static int p5_allocate_pmc(enum pmc_even
 static int p6_allocate_pmc(enum pmc_event _pe, char *_ctrspec,
     struct pmc_op_pmcallocate *_pmc_config);
 #endif
+#if defined(__amd64__) || defined(__i386__)
+static int tsc_allocate_pmc(enum pmc_event _pe, char *_ctrspec,
+    struct pmc_op_pmcallocate *_pmc_config);
+#endif
 
 #define PMC_CALL(cmd, params)				\
 	syscall(pmc_syscall, PMC_OP_##cmd, (params))
@@ -77,23 +81,96 @@ struct pmc_event_alias {
 static const struct pmc_event_alias *pmc_mdep_event_aliases;
 
 /*
- * The pmc_event_descr table maps symbolic names known to the user
+ * The pmc_event_descr structure maps symbolic names known to the user
  * to integer codes used by the PMC KLD.
  */
 struct pmc_event_descr {
 	const char	*pm_ev_name;
 	enum pmc_event	pm_ev_code;
-	enum pmc_class	pm_ev_class;
 };
 
-static const struct pmc_event_descr
-pmc_event_table[] =
+/*
+ * The pmc_class_descr structure maps class name prefixes for
+ * event names to event tables and other PMC class data.
+ */
+struct pmc_class_descr {
+	const char	*pm_evc_name;
+	size_t		pm_evc_name_size;
+	enum pmc_class	pm_evc_class;
+	const struct pmc_event_descr *pm_evc_event_table;
+	size_t		pm_evc_event_table_size;
+	int		(*pm_evc_allocate_pmc)(enum pmc_event _pe,
+			    char *_ctrspec, struct pmc_op_pmcallocate *_pa);
+};
+
+#define	PMC_TABLE_SIZE(N)	(sizeof(N)/sizeof(N[0]))
+#define	PMC_EVENT_TABLE_SIZE(N)	PMC_TABLE_SIZE(N##_event_table)
+
+#undef	__PMC_EV
+#define	__PMC_EV(C,N) { #N, PMC_EV_ ## C ## _ ## N },
+
+/*
+ * PMC_MDEP_TABLE(NAME, CLASS, ADDITIONAL_CLASSES...)
+ *
+ * Build an event descriptor table and a list of valid PMC classes.
+ */
+#define	PMC_MDEP_TABLE(N,C,...)				\
+	static const struct pmc_event_descr N##_event_table[] =	\
+	{							\
+		__PMC_EV_##C()					\
+	};							\
+	static const enum pmc_class N##_pmc_classes[] = {	\
+		PMC_CLASS_##C, __VA_ARGS__			\
+	}
+
+PMC_MDEP_TABLE(k7, K7, PMC_CLASS_TSC);
+PMC_MDEP_TABLE(k8, K8, PMC_CLASS_TSC);
+PMC_MDEP_TABLE(p4, P4, PMC_CLASS_TSC);
+PMC_MDEP_TABLE(p5, P5, PMC_CLASS_TSC);
+PMC_MDEP_TABLE(p6, P6, PMC_CLASS_TSC);
+
+static const struct pmc_event_descr tsc_event_table[] =
 {
-#undef  __PMC_EV
-#define	__PMC_EV(C,N,EV) { #EV, PMC_EV_ ## C ## _ ## N, PMC_CLASS_ ## C },
-	__PMC_EVENTS()
+	__PMC_EV_TSC()
 };
 
+#undef	PMC_CLASS_TABLE_DESC
+#define	PMC_CLASS_TABLE_DESC(N, C)	{			\
+		.pm_evc_name  = #N "-",				\
+		.pm_evc_name_size = sizeof(#N "-") - 1,		\
+		.pm_evc_class = PMC_CLASS_##C ,			\
+		.pm_evc_event_table = N##_event_table ,		\
+		.pm_evc_event_table_size = 			\
+			PMC_EVENT_TABLE_SIZE(N),		\
+		.pm_evc_allocate_pmc = N##_allocate_pmc		\
+	}
+
+static const struct pmc_class_descr pmc_class_table[] =
+{
+#if	defined(__i386__)
+	PMC_CLASS_TABLE_DESC(k7, K7),
+#endif
+#if	defined(__i386__) || defined(__amd64__)
+	PMC_CLASS_TABLE_DESC(k8, K8),
+	PMC_CLASS_TABLE_DESC(p4, P4),
+#endif
+#if	defined(__i386__)
+	PMC_CLASS_TABLE_DESC(p5, P5),
+	PMC_CLASS_TABLE_DESC(p6, P6),
+#endif
+#if	defined(__i386__) || defined(__amd64__)
+	PMC_CLASS_TABLE_DESC(tsc, TSC)
+#endif
+};
+
+static size_t pmc_event_class_table_size =
+    PMC_TABLE_SIZE(pmc_class_table);
+
+#undef	PMC_CLASS_TABLE_DESC
+
+static const enum pmc_class *pmc_mdep_class_list;
+static size_t pmc_mdep_class_list_size;
+
 /*
  * Mapping tables, mapping enumeration values to human readable
  * strings.
@@ -111,9 +188,14 @@ static const char * pmc_class_names[] = 
 	__PMC_CLASSES()
 };
 
-static const char * pmc_cputype_names[] = {
+struct pmc_cputype_map {
+	enum pmc_class	pm_cputype;
+	const char	*pm_name;
+};
+
+static const struct pmc_cputype_map pmc_cputype_names[] = {
 #undef	__PMC_CPU
-#define	__PMC_CPU(S, D) #S ,
+#define	__PMC_CPU(S, V, D) { .pm_cputype = PMC_CPU_##S, .pm_name = #S } ,
 	__PMC_CPUS()
 };
 
@@ -139,11 +221,6 @@ static int pmc_syscall = -1;		/* filled 
 
 static struct pmc_cpuinfo cpu_info;	/* filled in by pmc_init() */
 
-
-/* Architecture dependent event parsing */
-static int (*pmc_mdep_allocate_pmc)(enum pmc_event _pe, char *_ctrspec,
-    struct pmc_op_pmcallocate *_pmc_config);
-
 /* Event masks for events */
 struct pmc_masks {
 	const char	*pm_name;
@@ -167,7 +244,8 @@ pmc_parse_mask(const struct pmc_masks *p
 		return (-1);
 	c = 0;			/* count of mask keywords seen */
 	while ((r = strsep(&q, "+")) != NULL) {
-		for (pm = pmask; pm->pm_name && strcmp(r, pm->pm_name); pm++)
+		for (pm = pmask; pm->pm_name && strcasecmp(r, pm->pm_name);
+		    pm++)
 			;
 		if (pm->pm_name == NULL) /* not found */
 			return (-1);
@@ -215,14 +293,7 @@ k7_allocate_pmc(enum pmc_event pe, char 
 	uint32_t	count, unitmask;
 
 	pmc_config->pm_md.pm_amd.pm_amd_config = 0;
-	pmc_config->pm_caps |= PMC_CAP_READ;
-
-	if (pe == PMC_EV_TSC_TSC) {
-		/* TSC events must be unqualified. */
-		if (ctrspec && *ctrspec != '\0')
-			return (-1);
-		return (0);
-	}
+	pmc_config->pm_caps |= (PMC_CAP_READ | PMC_CAP_WRITE);
 
 	if (pe == PMC_EV_K7_DC_REFILLS_FROM_L2 ||
 	    pe == PMC_EV_K7_DC_REFILLS_FROM_SYSTEM ||
@@ -232,8 +303,6 @@ k7_allocate_pmc(enum pmc_event pe, char 
 	} else
 		unitmask = has_unitmask = 0;
 
-	pmc_config->pm_caps |= PMC_CAP_WRITE;
-
 	while ((p = strsep(&ctrspec, ",")) != NULL) {
 		if (KWPREFIXMATCH(p, K7_KW_COUNT "=")) {
 			q = strchr(p, '=');
@@ -514,16 +583,9 @@ k8_allocate_pmc(enum pmc_event pe, char 
 	uint32_t	count, evmask;
 	const struct pmc_masks	*pm, *pmask;
 
-	pmc_config->pm_caps |= PMC_CAP_READ;
+	pmc_config->pm_caps |= (PMC_CAP_READ | PMC_CAP_WRITE);
 	pmc_config->pm_md.pm_amd.pm_amd_config = 0;
 
-	if (pe == PMC_EV_TSC_TSC) {
-		/* TSC events must be unqualified. */
-		if (ctrspec && *ctrspec != '\0')
-			return (-1);
-		return (0);
-	}
-
 	pmask = NULL;
 	evmask = 0;
 
@@ -597,8 +659,6 @@ k8_allocate_pmc(enum pmc_event pe, char 
 		break;		/* no options defined */
 	}
 
-	pmc_config->pm_caps |= PMC_CAP_WRITE;
-
 	while ((p = strsep(&ctrspec, ",")) != NULL) {
 		if (KWPREFIXMATCH(p, K8_KW_COUNT "=")) {
 			q = strchr(p, '=');
@@ -1005,22 +1065,14 @@ p4_allocate_pmc(enum pmc_event pe, char 
 	uint32_t evmask, cccractivemask;
 	const struct pmc_masks *pm, *pmask;
 
-	pmc_config->pm_caps |= PMC_CAP_READ;
+	pmc_config->pm_caps |= (PMC_CAP_READ | PMC_CAP_WRITE);
 	pmc_config->pm_md.pm_p4.pm_p4_cccrconfig =
 	    pmc_config->pm_md.pm_p4.pm_p4_escrconfig = 0;
 
-	if (pe == PMC_EV_TSC_TSC) {
-		/* TSC must not be further qualified */
-		if (ctrspec && *ctrspec != '\0')
-			return (-1);
-		return (0);
-	}
-
 	pmask   = NULL;
 	evmask  = 0;
 	cccractivemask = 0x3;
 	has_tag = has_busreqtype = 0;
-	pmc_config->pm_caps |= PMC_CAP_WRITE;
 
 #define	__P4SETMASK(M) do {				\
 	pmask = p4_mask_##M;				\
@@ -1166,13 +1218,13 @@ p4_allocate_pmc(enum pmc_event pe, char 
 			if (*++q == '\0') /* skip '=' */
 				return (-1);
 
-			if (strcmp(q, P4_KW_ACTIVE_NONE) == 0)
+			if (strcasecmp(q, P4_KW_ACTIVE_NONE) == 0)
 				cccractivemask = 0x0;
-			else if (strcmp(q, P4_KW_ACTIVE_SINGLE) == 0)
+			else if (strcasecmp(q, P4_KW_ACTIVE_SINGLE) == 0)
 				cccractivemask = 0x1;
-			else if (strcmp(q, P4_KW_ACTIVE_BOTH) == 0)
+			else if (strcasecmp(q, P4_KW_ACTIVE_BOTH) == 0)
 				cccractivemask = 0x2;
-			else if (strcmp(q, P4_KW_ACTIVE_ANY) == 0)
+			else if (strcasecmp(q, P4_KW_ACTIVE_ANY) == 0)
 				cccractivemask = 0x3;
 			else
 				return (-1);
@@ -1442,16 +1494,9 @@ p6_allocate_pmc(enum pmc_event pe, char 
 	int count, n;
 	const struct pmc_masks *pm, *pmask;
 
-	pmc_config->pm_caps |= PMC_CAP_READ;
+	pmc_config->pm_caps |= (PMC_CAP_READ | PMC_CAP_WRITE);
 	pmc_config->pm_md.pm_ppro.pm_ppro_config = 0;
 
-	if (pe == PMC_EV_TSC_TSC) {
-		if (ctrspec && *ctrspec != '\0')
-			return (-1);
-		return (0);
-	}
-
-	pmc_config->pm_caps |= PMC_CAP_WRITE;
 	evmask = 0;
 
 #define	P6MASKSET(M)	pmask = p6_mask_ ## M
@@ -1638,6 +1683,93 @@ p6_allocate_pmc(enum pmc_event pe, char 
 
 #endif
 
+#if	defined(__i386__) || defined(__amd64__)
+static int
+tsc_allocate_pmc(enum pmc_event pe, char *ctrspec,
+    struct pmc_op_pmcallocate *pmc_config)
+{
+	if (pe != PMC_EV_TSC_TSC)
+		return (-1);
+
+	/* TSC events must be unqualified. */
+	if (ctrspec && *ctrspec != '\0')
+		return (-1);
+
+	pmc_config->pm_md.pm_amd.pm_amd_config = 0;
+	pmc_config->pm_caps |= PMC_CAP_READ;
+
+	return (0);
+}
+#endif
+
+/*
+ * Match an event name `name' with its canonical form.
+ * 
+ * Matches are case insensitive and spaces, underscores and hyphen
+ * characters are considered to match each other.
+ *
+ * Returns 1 for a match, 0 otherwise.
+ */
+
+static int
+pmc_match_event_name(const char *name, const char *canonicalname)
+{
+	int cc, nc;
+	const unsigned char *c, *n;
+
+	c = (const unsigned char *) canonicalname;
+	n = (const unsigned char *) name;
+
+	for (; (nc = *n) && (cc = *c); n++, c++) {
+
+		if (toupper(nc) == cc)
+			continue;
+
+		if ((nc == ' ' || nc == '_' || nc == '-') &&
+		    (cc == ' ' || cc == '_' || cc == '-'))
+			continue;
+
+		return (0);
+	}
+
+	if (*n == '\0' && *c == '\0')
+		return (1);
+
+	return (0);
+}
+
+/*
+ * Match an event name against all the event named supported by a
+ * PMC class.
+ *
+ * Returns an event descriptor pointer on match or NULL otherwise.
+ */
+static const struct pmc_event_descr *
+pmc_match_event_class(const char *name,
+    const struct pmc_class_descr *pcd)
+{
+	size_t n;
+	const struct pmc_event_descr *ev;
+	
+	ev = pcd->pm_evc_event_table;
+	for (n = 0; n < pcd->pm_evc_event_table_size; n++, ev++)
+		if (pmc_match_event_name(name, ev->pm_ev_name))
+			return (ev);
+
+	return (NULL);
+}
+
+static int
+pmc_mdep_is_compatible_class(enum pmc_class pc)
+{
+	size_t n;
+
+	for (n = 0; n < pmc_mdep_class_list_size; n++)
+		if (pmc_mdep_class_list[n] == pc)
+			return (1);
+	return (0);
+}
+
 /*
  * API entry points
  */
@@ -1646,12 +1778,14 @@ int
 pmc_allocate(const char *ctrspec, enum pmc_mode mode,
     uint32_t flags, int cpu, pmc_id_t *pmcid)
 {
+	size_t n;
 	int retval;
-	enum pmc_event pe;
 	char *r, *spec_copy;
 	const char *ctrname;
-	const struct pmc_event_alias *p;
+	const struct pmc_event_descr *ev;
+	const struct pmc_event_alias *alias;
 	struct pmc_op_pmcallocate pmc_config;
+	const struct pmc_class_descr *pcd;
 
 	spec_copy = NULL;
 	retval    = -1;
@@ -1664,9 +1798,9 @@ pmc_allocate(const char *ctrspec, enum p
 
 	/* replace an event alias with the canonical event specifier */
 	if (pmc_mdep_event_aliases)
-		for (p = pmc_mdep_event_aliases; p->pm_alias; p++)
-			if (!strcmp(ctrspec, p->pm_alias)) {
-				spec_copy = strdup(p->pm_spec);
+		for (alias = pmc_mdep_event_aliases; alias->pm_alias; alias++)
+			if (!strcasecmp(ctrspec, alias->pm_alias)) {
+				spec_copy = strdup(alias->pm_spec);
 				break;
 			}
 
@@ -1676,19 +1810,43 @@ pmc_allocate(const char *ctrspec, enum p
 	r = spec_copy;
 	ctrname = strsep(&r, ",");
 
-	/* look for the given counter name */
-	for (pe = PMC_EVENT_FIRST; pe < (PMC_EVENT_LAST+1); pe++)
-		if (!strcmp(ctrname, pmc_event_table[pe].pm_ev_name))
+	/*
+	 * If a explicit class prefix was given by the user, restrict the
+	 * search for the event to the specified PMC class.
+	 */
+	ev = NULL;
+	for (n = 0; n < pmc_event_class_table_size; n++) {
+		pcd = &pmc_class_table[n];
+		if (pmc_mdep_is_compatible_class(pcd->pm_evc_class) &&
+		    strncasecmp(ctrname, pcd->pm_evc_name,
+				pcd->pm_evc_name_size) == 0) {
+			if ((ev = pmc_match_event_class(ctrname +
+			    pcd->pm_evc_name_size, pcd)) == NULL) {
+				errno = EINVAL;
+				goto out;
+			}
 			break;
+		}
+	}
 
-	if (pe > PMC_EVENT_LAST) {
+	/*
+	 * Otherwise, search for this event in all compatible PMC
+	 * classes.
+	 */
+	for (n = 0; ev == NULL && n < pmc_event_class_table_size; n++) {
+		pcd = &pmc_class_table[n];
+		if (pmc_mdep_is_compatible_class(pcd->pm_evc_class))
+			ev = pmc_match_event_class(ctrname, pcd);
+	}
+
+	if (ev == NULL) {
 		errno = EINVAL;
 		goto out;
 	}
 
 	bzero(&pmc_config, sizeof(pmc_config));
-	pmc_config.pm_ev    = pmc_event_table[pe].pm_ev_code;
-	pmc_config.pm_class = pmc_event_table[pe].pm_ev_class;
+	pmc_config.pm_ev    = ev->pm_ev_code;
+	pmc_config.pm_class = pcd->pm_evc_class;
 	pmc_config.pm_cpu   = cpu;
 	pmc_config.pm_mode  = mode;
 	pmc_config.pm_flags = flags;
@@ -1696,7 +1854,7 @@ pmc_allocate(const char *ctrspec, enum p
 	if (PMC_IS_SAMPLING_MODE(mode))
 		pmc_config.pm_caps |= PMC_CAP_INTERRUPT;
 
-	if (pmc_mdep_allocate_pmc(pe, r, &pmc_config) < 0) {
+ 	if (pcd->pm_evc_allocate_pmc(ev->pm_ev_code, r, &pmc_config) < 0) {
 		errno = EINVAL;
 		goto out;
 	}
@@ -1817,28 +1975,28 @@ pmc_event_names_of_class(enum pmc_class 
 	switch (cl)
 	{
 	case PMC_CLASS_TSC:
-		ev = &pmc_event_table[PMC_EV_TSC_TSC];
-		count = 1;
+		ev = tsc_event_table;
+		count = PMC_EVENT_TABLE_SIZE(tsc);
 		break;
 	case PMC_CLASS_K7:
-		ev = &pmc_event_table[PMC_EV_K7_FIRST];
-		count = PMC_EV_K7_LAST - PMC_EV_K7_FIRST + 1;
+		ev = k7_event_table;
+		count = PMC_EVENT_TABLE_SIZE(k7);
 		break;
 	case PMC_CLASS_K8:
-		ev = &pmc_event_table[PMC_EV_K8_FIRST];
-		count = PMC_EV_K8_LAST - PMC_EV_K8_FIRST + 1;
+		ev = k8_event_table;
+		count = PMC_EVENT_TABLE_SIZE(k8);
+		break;
+	case PMC_CLASS_P4:
+		ev = p4_event_table;
+		count = PMC_EVENT_TABLE_SIZE(p4);
 		break;
 	case PMC_CLASS_P5:
-		ev = &pmc_event_table[PMC_EV_P5_FIRST];
-		count = PMC_EV_P5_LAST - PMC_EV_P5_FIRST + 1;
+		ev = p5_event_table;
+		count = PMC_EVENT_TABLE_SIZE(p5);
 		break;
 	case PMC_CLASS_P6:
-		ev = &pmc_event_table[PMC_EV_P6_FIRST];
-		count = PMC_EV_P6_LAST - PMC_EV_P6_FIRST + 1;
-		break;
-	case PMC_CLASS_P4:
-		ev = &pmc_event_table[PMC_EV_P4_FIRST];
-		count = PMC_EV_P4_LAST - PMC_EV_P4_FIRST + 1;
+		ev = p6_event_table;
+		count = PMC_EVENT_TABLE_SIZE(p6);
 		break;
 	default:
 		errno = EINVAL;
@@ -1937,33 +2095,35 @@ pmc_init(void)
 	for (n = 0; n < cpu_info.pm_nclass; n++)
 		cpu_info.pm_classes[n] = op_cpu_info.pm_classes[n];
 
-	/* set parser pointer */
+#define	PMC_MDEP_INIT(C) do {					\
+		pmc_mdep_event_aliases    = C##_aliases;	\
+		pmc_mdep_class_list  = C##_pmc_classes;		\
+		pmc_mdep_class_list_size =			\
+		    PMC_TABLE_SIZE(C##_pmc_classes);		\
+	} while (0)
+
+	/* Configure the event name parser. */
 	switch (cpu_info.pm_cputype) {
 #if defined(__i386__)
 	case PMC_CPU_AMD_K7:
-		pmc_mdep_event_aliases = k7_aliases;
-		pmc_mdep_allocate_pmc = k7_allocate_pmc;
+		PMC_MDEP_INIT(k7);
 		break;
 	case PMC_CPU_INTEL_P5:
-		pmc_mdep_event_aliases = p5_aliases;
-		pmc_mdep_allocate_pmc = p5_allocate_pmc;
+		PMC_MDEP_INIT(p5);
 		break;
 	case PMC_CPU_INTEL_P6:		/* P6 ... Pentium M CPUs have */
 	case PMC_CPU_INTEL_PII:		/* similar PMCs. */
 	case PMC_CPU_INTEL_PIII:
 	case PMC_CPU_INTEL_PM:
-		pmc_mdep_event_aliases = p6_aliases;
-		pmc_mdep_allocate_pmc = p6_allocate_pmc;
+		PMC_MDEP_INIT(p6);
 		break;
 #endif
 #if defined(__amd64__) || defined(__i386__)
-	case PMC_CPU_INTEL_PIV:
-		pmc_mdep_event_aliases = p4_aliases;
-		pmc_mdep_allocate_pmc = p4_allocate_pmc;
-		break;
 	case PMC_CPU_AMD_K8:
-		pmc_mdep_event_aliases = k8_aliases;
-		pmc_mdep_allocate_pmc = k8_allocate_pmc;
+		PMC_MDEP_INIT(k8);
+		break;
+	case PMC_CPU_INTEL_PIV:
+		PMC_MDEP_INIT(p4);
 		break;
 #endif
 
@@ -2013,9 +2173,12 @@ pmc_name_of_class(enum pmc_class pc)
 const char *
 pmc_name_of_cputype(enum pmc_cputype cp)
 {
-	if ((int) cp >= PMC_CPU_FIRST &&
-	    cp <= PMC_CPU_LAST)
-		return (pmc_cputype_names[cp]);
+	size_t n;
+
+	for (n = 0; n < PMC_TABLE_SIZE(pmc_cputype_names); n++)
+		if (cp == pmc_cputype_names[n].pm_cputype)
+			return (pmc_cputype_names[n].pm_name);
+
 	errno = EINVAL;
 	return (NULL);
 }
@@ -2034,9 +2197,32 @@ pmc_name_of_disposition(enum pmc_disp pd
 const char *
 pmc_name_of_event(enum pmc_event pe)
 {
-	if ((int) pe >= PMC_EVENT_FIRST &&
-	    pe <= PMC_EVENT_LAST)
-		return (pmc_event_table[pe].pm_ev_name);
+	const struct pmc_event_descr *ev, *evfence;
+
+	ev = evfence = NULL;
+	if (pe >= PMC_EV_K7_FIRST && pe <= PMC_EV_K7_LAST) {
+		ev = k7_event_table;
+		evfence = k7_event_table + PMC_EVENT_TABLE_SIZE(k7);
+	} else if (pe >= PMC_EV_K8_FIRST && pe <= PMC_EV_K8_LAST) {
+		ev = k8_event_table;
+		evfence = k8_event_table + PMC_EVENT_TABLE_SIZE(k8);
+	} else if (pe >= PMC_EV_P4_FIRST && pe <= PMC_EV_P4_LAST) {
+		ev = p4_event_table;
+		evfence = p4_event_table + PMC_EVENT_TABLE_SIZE(p4);
+	} else if (pe >= PMC_EV_P5_FIRST && pe <= PMC_EV_P5_LAST) {
+		ev = p5_event_table;
+		evfence = p5_event_table + PMC_EVENT_TABLE_SIZE(p5);
+	} else if (pe >= PMC_EV_P6_FIRST && pe <= PMC_EV_P6_LAST) {
+		ev = p6_event_table;
+		evfence = p6_event_table + PMC_EVENT_TABLE_SIZE(p6);
+	} else if (pe == PMC_EV_TSC_TSC) {
+		ev = tsc_event_table;
+		evfence = tsc_event_table + PMC_EVENT_TABLE_SIZE(tsc);
+	}
+
+	for (; ev != evfence; ev++)
+		if (pe == ev->pm_ev_code)
+			return (ev->pm_ev_name);
 
 	errno = EINVAL;
 	return (NULL);

Modified: head/sys/dev/hwpmc/pmc_events.h
==============================================================================
--- head/sys/dev/hwpmc/pmc_events.h	Thu Oct  9 12:56:57 2008	(r183724)
+++ head/sys/dev/hwpmc/pmc_events.h	Thu Oct  9 14:55:45 2008	(r183725)
@@ -41,35 +41,30 @@
  * Optimization Guide" [Doc#22007K, Feb 2002]
  */
 
-#define	__PMC_EV_K7()							\
-__PMC_EV(K7, DC_ACCESSES,		k7-dc-accesses)			\
-__PMC_EV(K7, DC_MISSES,			k7-dc-misses)			\
-__PMC_EV(K7, DC_REFILLS_FROM_L2,	k7-dc-refills-from-l2)		\
-__PMC_EV(K7, DC_REFILLS_FROM_SYSTEM,	k7-dc-refills-from-system)	\
-__PMC_EV(K7, DC_WRITEBACKS,		k7-dc-writebacks)		\
-__PMC_EV(K7, L1_DTLB_MISS_AND_L2_DTLB_HITS,				\
-			k7-l1-dtlb-miss-and-l2-dtlb-hits)		\
-__PMC_EV(K7, L1_AND_L2_DTLB_MISSES,	k7-l1-and-l2-dtlb-misses)	\
-__PMC_EV(K7, MISALIGNED_REFERENCES,	k7-misaligned-references)	\
-__PMC_EV(K7, IC_FETCHES,		k7-ic-fetches)			\
-__PMC_EV(K7, IC_MISSES,			k7-ic-misses)			\
-__PMC_EV(K7, L1_ITLB_MISSES,		k7-l1-itlb-misses)		\
-__PMC_EV(K7, L1_L2_ITLB_MISSES,		k7-l1-l2-itlb-misses)		\
-__PMC_EV(K7, RETIRED_INSTRUCTIONS,	k7-retired-instructions)	\
-__PMC_EV(K7, RETIRED_OPS,		k7-retired-ops)			\
-__PMC_EV(K7, RETIRED_BRANCHES,		k7-retired-branches)		\
-__PMC_EV(K7, RETIRED_BRANCHES_MISPREDICTED,				\
-			k7-retired-branches-mispredicted)		\
-__PMC_EV(K7, RETIRED_TAKEN_BRANCHES,	k7-retired-taken-branches)	\
-__PMC_EV(K7, RETIRED_TAKEN_BRANCHES_MISPREDICTED,			\
-			k7-retired-taken-branches-mispredicted)		\
-__PMC_EV(K7, RETIRED_FAR_CONTROL_TRANSFERS,				\
-			k7-retired-far-control-transfers)		\
-__PMC_EV(K7, RETIRED_RESYNC_BRANCHES, k7-retired-resync-branches)	\
-__PMC_EV(K7, INTERRUPTS_MASKED_CYCLES, k7-interrupts-masked-cycles)	\
-__PMC_EV(K7, INTERRUPTS_MASKED_WHILE_PENDING_CYCLES,			\
-			k7-interrupts-masked-while-pending-cycles)	\
-__PMC_EV(K7, HARDWARE_INTERRUPTS,	k7-hardware-interrupts)
+#define	__PMC_EV_K7()					\
+__PMC_EV(K7, DC_ACCESSES)				\
+__PMC_EV(K7, DC_MISSES)					\
+__PMC_EV(K7, DC_REFILLS_FROM_L2)			\
+__PMC_EV(K7, DC_REFILLS_FROM_SYSTEM)			\
+__PMC_EV(K7, DC_WRITEBACKS)				\
+__PMC_EV(K7, L1_DTLB_MISS_AND_L2_DTLB_HITS)		\
+__PMC_EV(K7, L1_AND_L2_DTLB_MISSES)			\
+__PMC_EV(K7, MISALIGNED_REFERENCES)			\
+__PMC_EV(K7, IC_FETCHES)				\
+__PMC_EV(K7, IC_MISSES)					\
+__PMC_EV(K7, L1_ITLB_MISSES)				\
+__PMC_EV(K7, L1_L2_ITLB_MISSES)				\
+__PMC_EV(K7, RETIRED_INSTRUCTIONS)			\
+__PMC_EV(K7, RETIRED_OPS)				\
+__PMC_EV(K7, RETIRED_BRANCHES)				\
+__PMC_EV(K7, RETIRED_BRANCHES_MISPREDICTED)		\
+__PMC_EV(K7, RETIRED_TAKEN_BRANCHES)			\
+__PMC_EV(K7, RETIRED_TAKEN_BRANCHES_MISPREDICTED)	\
+__PMC_EV(K7, RETIRED_FAR_CONTROL_TRANSFERS)		\
+__PMC_EV(K7, RETIRED_RESYNC_BRANCHES)			\
+__PMC_EV(K7, INTERRUPTS_MASKED_CYCLES)			\
+__PMC_EV(K7, INTERRUPTS_MASKED_WHILE_PENDING_CYCLES)	\
+__PMC_EV(K7, HARDWARE_INTERRUPTS)
 
 #define	PMC_EV_K7_FIRST	PMC_EV_K7_DC_ACCESSES
 #define	PMC_EV_K7_LAST	PMC_EV_K7_HARDWARE_INTERRUPTS
@@ -79,169 +74,165 @@ __PMC_EV(K7, HARDWARE_INTERRUPTS,	k7-har
  * Developer's Manual, Volume 3: System Programming Guide" [245472-012]
  */
 
-#define	__PMC_EV_P4()							\
-__PMC_EV(P4, TC_DELIVER_MODE,		p4-tc-deliver-mode)		\
-__PMC_EV(P4, BPU_FETCH_REQUEST,		p4-bpu-fetch-request)		\
-__PMC_EV(P4, ITLB_REFERENCE,		p4-itlb-reference)		\
-__PMC_EV(P4, MEMORY_CANCEL,		p4-memory-cancel)		\
-__PMC_EV(P4, MEMORY_COMPLETE,		p4-memory-complete)		\
-__PMC_EV(P4, LOAD_PORT_REPLAY,		p4-load-port-replay)		\
-__PMC_EV(P4, STORE_PORT_REPLAY,		p4-store-port-replay)		\
-__PMC_EV(P4, MOB_LOAD_REPLAY,		p4-mob-load-replay)		\
-__PMC_EV(P4, PAGE_WALK_TYPE,		p4-page-walk-type)		\
-__PMC_EV(P4, BSQ_CACHE_REFERENCE,	p4-bsq-cache-reference)		\
-__PMC_EV(P4, IOQ_ALLOCATION,		p4-ioq-allocation)		\
-__PMC_EV(P4, IOQ_ACTIVE_ENTRIES,	p4-ioq-active-entries)		\
-__PMC_EV(P4, FSB_DATA_ACTIVITY,		p4-fsb-data-activity)		\
-__PMC_EV(P4, BSQ_ALLOCATION,		p4-bsq-allocation)		\
-__PMC_EV(P4, BSQ_ACTIVE_ENTRIES,	p4-bsq-active-entries)		\
-__PMC_EV(P4, SSE_INPUT_ASSIST,		p4-sse-input-assist)		\
-__PMC_EV(P4, PACKED_SP_UOP,		p4-packed-sp-uop)		\
-__PMC_EV(P4, PACKED_DP_UOP,		p4-packed-dp-uop)		\
-__PMC_EV(P4, SCALAR_SP_UOP,		p4-scalar-sp-uop)		\
-__PMC_EV(P4, SCALAR_DP_UOP,		p4-scalar-dp-uop)		\
-__PMC_EV(P4, 64BIT_MMX_UOP,		p4-64bit-mmx-uop)		\
-__PMC_EV(P4, 128BIT_MMX_UOP,		p4-128bit-mmx-uop)		\
-__PMC_EV(P4, X87_FP_UOP,		p4-x87-fp-uop)			\
-__PMC_EV(P4, X87_SIMD_MOVES_UOP,	p4-x87-simd-moves-uop)		\
-__PMC_EV(P4, GLOBAL_POWER_EVENTS,	p4-global-power-events)		\
-__PMC_EV(P4, TC_MS_XFER,		p4-tc-ms-xfer)			\
-__PMC_EV(P4, UOP_QUEUE_WRITES,		p4-uop-queue-writes)		\
-__PMC_EV(P4, RETIRED_MISPRED_BRANCH_TYPE,				\
-			    p4-retired-mispred-branch-type)		\
-__PMC_EV(P4, RETIRED_BRANCH_TYPE,	p4-retired-branch-type)		\
-__PMC_EV(P4, RESOURCE_STALL,		p4-resource-stall)		\
-__PMC_EV(P4, WC_BUFFER,			p4-wc-buffer)			\
-__PMC_EV(P4, B2B_CYCLES,		p4-b2b-cycles)			\
-__PMC_EV(P4, BNR,			p4-bnr)				\
-__PMC_EV(P4, SNOOP,			p4-snoop)			\
-__PMC_EV(P4, RESPONSE,			p4-response)			\
-__PMC_EV(P4, FRONT_END_EVENT,		p4-front-end-event)		\
-__PMC_EV(P4, EXECUTION_EVENT,		p4-execution-event)		\
-__PMC_EV(P4, REPLAY_EVENT,		p4-replay-event)		\
-__PMC_EV(P4, INSTR_RETIRED,		p4-instr-retired)		\
-__PMC_EV(P4, UOPS_RETIRED,		p4-uops-retired)		\
-__PMC_EV(P4, UOP_TYPE,			p4-uop-type)			\
-__PMC_EV(P4, BRANCH_RETIRED,		p4-branch-retired)		\
-__PMC_EV(P4, MISPRED_BRANCH_RETIRED,	p4-mispred-branch-retired)	\
-__PMC_EV(P4, X87_ASSIST,		p4-x87-assist)			\
-__PMC_EV(P4, MACHINE_CLEAR,		p4-machine-clear)
+#define	__PMC_EV_P4()				\
+__PMC_EV(P4, TC_DELIVER_MODE)			\
+__PMC_EV(P4, BPU_FETCH_REQUEST)			\
+__PMC_EV(P4, ITLB_REFERENCE)			\
+__PMC_EV(P4, MEMORY_CANCEL)			\
+__PMC_EV(P4, MEMORY_COMPLETE)			\
+__PMC_EV(P4, LOAD_PORT_REPLAY)			\
+__PMC_EV(P4, STORE_PORT_REPLAY)			\
+__PMC_EV(P4, MOB_LOAD_REPLAY)			\
+__PMC_EV(P4, PAGE_WALK_TYPE)			\
+__PMC_EV(P4, BSQ_CACHE_REFERENCE)		\
+__PMC_EV(P4, IOQ_ALLOCATION)			\
+__PMC_EV(P4, IOQ_ACTIVE_ENTRIES)		\
+__PMC_EV(P4, FSB_DATA_ACTIVITY)			\
+__PMC_EV(P4, BSQ_ALLOCATION)			\
+__PMC_EV(P4, BSQ_ACTIVE_ENTRIES)		\
+__PMC_EV(P4, SSE_INPUT_ASSIST)			\
+__PMC_EV(P4, PACKED_SP_UOP)			\
+__PMC_EV(P4, PACKED_DP_UOP)			\
+__PMC_EV(P4, SCALAR_SP_UOP)			\
+__PMC_EV(P4, SCALAR_DP_UOP)			\
+__PMC_EV(P4, 64BIT_MMX_UOP)			\
+__PMC_EV(P4, 128BIT_MMX_UOP)			\
+__PMC_EV(P4, X87_FP_UOP)			\
+__PMC_EV(P4, X87_SIMD_MOVES_UOP)		\
+__PMC_EV(P4, GLOBAL_POWER_EVENTS)		\
+__PMC_EV(P4, TC_MS_XFER)			\
+__PMC_EV(P4, UOP_QUEUE_WRITES)			\
+__PMC_EV(P4, RETIRED_MISPRED_BRANCH_TYPE)	\
+__PMC_EV(P4, RETIRED_BRANCH_TYPE)		\
+__PMC_EV(P4, RESOURCE_STALL)			\
+__PMC_EV(P4, WC_BUFFER)				\
+__PMC_EV(P4, B2B_CYCLES)			\
+__PMC_EV(P4, BNR)				\
+__PMC_EV(P4, SNOOP)				\
+__PMC_EV(P4, RESPONSE)				\
+__PMC_EV(P4, FRONT_END_EVENT)			\
+__PMC_EV(P4, EXECUTION_EVENT)			\
+__PMC_EV(P4, REPLAY_EVENT)			\
+__PMC_EV(P4, INSTR_RETIRED)			\
+__PMC_EV(P4, UOPS_RETIRED)			\
+__PMC_EV(P4, UOP_TYPE)				\
+__PMC_EV(P4, BRANCH_RETIRED)			\
+__PMC_EV(P4, MISPRED_BRANCH_RETIRED)		\
+__PMC_EV(P4, X87_ASSIST)			\
+__PMC_EV(P4, MACHINE_CLEAR)
 
 #define	PMC_EV_P4_FIRST PMC_EV_P4_TC_DELIVER_MODE
 #define	PMC_EV_P4_LAST	PMC_EV_P4_MACHINE_CLEAR
 
 /* Intel Pentium Pro, P-II, P-III and Pentium-M style events */
 
-#define	__PMC_EV_P6()							\
-__PMC_EV(P6, DATA_MEM_REFS,		p6-data-mem-refs)		\
-__PMC_EV(P6, DCU_LINES_IN,		p6-dcu-lines-in)		\
-__PMC_EV(P6, DCU_M_LINES_IN,		p6-dcu-m-lines-in)		\
-__PMC_EV(P6, DCU_M_LINES_OUT,		p6-dcu-m-lines-out)		\
-__PMC_EV(P6, DCU_MISS_OUTSTANDING,	p6-dcu-miss-outstanding)	\
-__PMC_EV(P6, IFU_FETCH,			p6-ifu-ifetch)			\
-__PMC_EV(P6, IFU_FETCH_MISS,		p6-ifu-ifetch-miss)		\
-__PMC_EV(P6, ITLB_MISS,			p6-itlb-miss)			\
-__PMC_EV(P6, IFU_MEM_STALL,		p6-ifu-mem-stall)		\
-__PMC_EV(P6, ILD_STALL,			p6-ild-stall)			\
-__PMC_EV(P6, L2_IFETCH,			p6-l2-ifetch)			\
-__PMC_EV(P6, L2_LD,			p6-l2-ld)			\
-__PMC_EV(P6, L2_ST,			p6-l2-st)			\
-__PMC_EV(P6, L2_LINES_IN,		p6-l2-lines-in)			\
-__PMC_EV(P6, L2_LINES_OUT,		p6-l2-lines-out)		\
-__PMC_EV(P6, L2_M_LINES_INM,		p6-l2-m-lines-inm)		\
-__PMC_EV(P6, L2_M_LINES_OUTM,		p6-l2-m-lines-outm)		\
-__PMC_EV(P6, L2_RQSTS,			p6-l2-rqsts)			\
-__PMC_EV(P6, L2_ADS,			p6-l2-ads)			\
-__PMC_EV(P6, L2_DBUS_BUSY,		p6-l2-dbus-busy)		\
-__PMC_EV(P6, L2_DBUS_BUSY_RD,		p6-l2-dbus-busy-rd)		\
-__PMC_EV(P6, BUS_DRDY_CLOCKS,		p6-bus-drdy-clocks)		\
-__PMC_EV(P6, BUS_LOCK_CLOCKS,		p6-bus-lock-clocks)		\
-__PMC_EV(P6, BUS_REQ_OUTSTANDING,	p6-bus-req-outstanding)		\
-__PMC_EV(P6, BUS_TRAN_BRD,		p6-bus-tran-brd)		\
-__PMC_EV(P6, BUS_TRAN_RFO,		p6-bus-tran-rfo)		\
-__PMC_EV(P6, BUS_TRANS_WB,		p6-bus-trans-wb)		\
-__PMC_EV(P6, BUS_TRAN_IFETCH,		p6-bus-tran-ifetch)		\
-__PMC_EV(P6, BUS_TRAN_INVAL,		p6-bus-tran-inval)		\
-__PMC_EV(P6, BUS_TRAN_PWR,		p6-bus-tran-pwr)		\
-__PMC_EV(P6, BUS_TRANS_P,		p6-bus-trans-p)			\
-__PMC_EV(P6, BUS_TRANS_IO,		p6-bus-trans-io)		\
-__PMC_EV(P6, BUS_TRAN_DEF,		p6-bus-tran-def)		\
-__PMC_EV(P6, BUS_TRAN_BURST,		p6-bus-tran-burst)		\
-__PMC_EV(P6, BUS_TRAN_ANY,		p6-bus-tran-any)		\
-__PMC_EV(P6, BUS_TRAN_MEM,		p6-bus-tran-mem)		\
-__PMC_EV(P6, BUS_DATA_RCV,		p6-bus-data-rcv)		\
-__PMC_EV(P6, BUS_BNR_DRV,		p6-bus-bnr-drv)			\
-__PMC_EV(P6, BUS_HIT_DRV,		p6-bus-hit-drv)			\
-__PMC_EV(P6, BUS_HITM_DRV,		p6-bus-hitm-drv)		\
-__PMC_EV(P6, BUS_SNOOP_STALL,		p6-bus-snoop-stall)		\
-__PMC_EV(P6, FLOPS,			p6-flops)			\
-__PMC_EV(P6, FP_COMPS_OPS_EXE,		p6-fp-comps-ops-exe)		\
-__PMC_EV(P6, FP_ASSIST,			p6-fp-assist)			\
-__PMC_EV(P6, MUL,			p6-mul)				\
-__PMC_EV(P6, DIV,			p6-div)				\
-__PMC_EV(P6, CYCLES_DIV_BUSY,		p6-cycles-div-busy)		\
-__PMC_EV(P6, LD_BLOCKS,			p6-ld-blocks)			\
-__PMC_EV(P6, SB_DRAINS,			p6-sb-drains)			\
-__PMC_EV(P6, MISALIGN_MEM_REF,		p6-misalign-mem-ref)		\
-__PMC_EV(P6, EMON_KNI_PREF_DISPATCHED,	p6-emon-kni-pref-dispatched)	\
-__PMC_EV(P6, EMON_KNI_PREF_MISS,	p6-emon-kni-pref-miss)		\
-__PMC_EV(P6, INST_RETIRED,		p6-inst-retired)		\
-__PMC_EV(P6, UOPS_RETIRED,		p6-uops-retired)		\
-__PMC_EV(P6, INST_DECODED,		p6-inst-decoded)		\
-__PMC_EV(P6, EMON_KNI_INST_RETIRED,	p6-emon-kni-inst-retired)	\
-__PMC_EV(P6, EMON_KNI_COMP_INST_RET,	p6-emon-kni-comp-inst-ret)	\
-__PMC_EV(P6, HW_INT_RX,			p6-hw-int-rx)			\
-__PMC_EV(P6, CYCLES_INT_MASKED,		p6-cycles-int-masked)		\
-__PMC_EV(P6, CYCLES_INT_PENDING_AND_MASKED,				\
-			    p6-cycles-int-pending-and-masked)		\
-__PMC_EV(P6, BR_INST_RETIRED,		p6-br-inst-retired)		\
-__PMC_EV(P6, BR_MISS_PRED_RETIRED,	p6-br-miss-pred-retired)	\
-__PMC_EV(P6, BR_TAKEN_RETIRED,		p6-br-taken-retired)		\
-__PMC_EV(P6, BR_MISS_PRED_TAKEN_RET,	p6-br-miss-pred-taken-ret)	\
-__PMC_EV(P6, BR_INST_DECODED,		p6-br-inst-decoded)		\
-__PMC_EV(P6, BTB_MISSES,		p6-btb-misses)			\
-__PMC_EV(P6, BR_BOGUS,			p6-br-bogus)			\
-__PMC_EV(P6, BACLEARS,			p6-baclears)			\
-__PMC_EV(P6, RESOURCE_STALLS,		p6-resource-stalls)		\
-__PMC_EV(P6, PARTIAL_RAT_STALLS,	p6-partial-rat-stalls)		\
-__PMC_EV(P6, SEGMENT_REG_LOADS,		p6-segment-reg-loads)		\
-__PMC_EV(P6, CPU_CLK_UNHALTED,		p6-cpu-clk-unhalted)		\
-__PMC_EV(P6, MMX_INSTR_EXEC,		p6-mmx-instr-exec)		\
-__PMC_EV(P6, MMX_SAT_INSTR_EXEC,	p6-mmx-sat-instr-exec)		\
-__PMC_EV(P6, MMX_UOPS_EXEC,		p6-mmx-uops-exec)		\
-__PMC_EV(P6, MMX_INSTR_TYPE_EXEC,	p6-mmx-instr-type-exec)		\
-__PMC_EV(P6, FP_MMX_TRANS,		p6-fp-mmx-trans)		\
-__PMC_EV(P6, MMX_ASSIST,		p6-mmx-assist)			\
-__PMC_EV(P6, MMX_INSTR_RET,		p6-mmx-instr-ret)		\
-__PMC_EV(P6, SEG_RENAME_STALLS,		p6-seg-rename-stalls)		\
-__PMC_EV(P6, SEG_REG_RENAMES,		p6-seg-reg-renames)		\
-__PMC_EV(P6, RET_SEG_RENAMES,		p6-ret-seg-renames)		\
-__PMC_EV(P6, EMON_EST_TRANS,		p6-emon-est-trans)		\
-__PMC_EV(P6, EMON_THERMAL_TRIP,		p6-emon-thermal-trip)		\
-__PMC_EV(P6, BR_INST_EXEC,		p6-br-inst-exec)		\
-__PMC_EV(P6, BR_MISSP_EXEC,		p6-br-missp-exec)		\
-__PMC_EV(P6, BR_BAC_MISSP_EXEC,		p6-br-bac-missp-exec)		\
-__PMC_EV(P6, BR_CND_EXEC,		p6-br-cnd-exec)			\
-__PMC_EV(P6, BR_CND_MISSP_EXEC,		p6-br-cnd-missp-exec)		\
-__PMC_EV(P6, BR_IND_EXEC,		p6-br-ind-exec)			\
-__PMC_EV(P6, BR_IND_MISSP_EXEC,		p6-br-ind-missp-exec)		\
-__PMC_EV(P6, BR_RET_EXEC,		p6-br-ret-exec)			\
-__PMC_EV(P6, BR_RET_MISSP_EXEC,		p6-br-ret-missp-exec)		\
-__PMC_EV(P6, BR_RET_BAC_MISSP_EXEC,	p6-br-ret-bac-missp-exec)	\
-__PMC_EV(P6, BR_CALL_EXEC,		p6-br-call-exec)		\
-__PMC_EV(P6, BR_CALL_MISSP_EXEC,	p6-br-call-missp-exec)		\
-__PMC_EV(P6, BR_IND_CALL_EXEC,		p6-br-ind-call-exec)		\
-__PMC_EV(P6, EMON_SIMD_INSTR_RETIRED,	p6-emon-simd-instr-retired)	\
-__PMC_EV(P6, EMON_SYNCH_UOPS,		p6-emon-synch-uops)		\
-__PMC_EV(P6, EMON_ESP_UOPS,		p6-emon-esp-uops)		\
-__PMC_EV(P6, EMON_FUSED_UOPS_RET,	p6-emon-fused-uops-ret)		\
-__PMC_EV(P6, EMON_UNFUSION,		p6-emon-unfusion)		\
-__PMC_EV(P6, EMON_PREF_RQSTS_UP,	p6-emon-pref-rqsts-up)		\
-__PMC_EV(P6, EMON_PREF_RQSTS_DN,	p6-emon-pref-rqsts-dn)		\
-__PMC_EV(P6, EMON_SSE_SSE2_INST_RETIRED,				\
-				p6-emon-sse-sse2-inst-retired)		\
-__PMC_EV(P6, EMON_SSE_SSE2_COMP_INST_RETIRED,				\
-				p6-emon-sse-sse2-comp-inst-retired)
+#define	__PMC_EV_P6()				\
+__PMC_EV(P6, DATA_MEM_REFS)			\
+__PMC_EV(P6, DCU_LINES_IN)			\
+__PMC_EV(P6, DCU_M_LINES_IN)			\
+__PMC_EV(P6, DCU_M_LINES_OUT)			\
+__PMC_EV(P6, DCU_MISS_OUTSTANDING)		\
+__PMC_EV(P6, IFU_FETCH)				\
+__PMC_EV(P6, IFU_FETCH_MISS)			\
+__PMC_EV(P6, ITLB_MISS)				\
+__PMC_EV(P6, IFU_MEM_STALL)			\
+__PMC_EV(P6, ILD_STALL)				\
+__PMC_EV(P6, L2_IFETCH)				\
+__PMC_EV(P6, L2_LD)				\
+__PMC_EV(P6, L2_ST)				\
+__PMC_EV(P6, L2_LINES_IN)			\
+__PMC_EV(P6, L2_LINES_OUT)			\
+__PMC_EV(P6, L2_M_LINES_INM)			\
+__PMC_EV(P6, L2_M_LINES_OUTM)			\
+__PMC_EV(P6, L2_RQSTS)				\
+__PMC_EV(P6, L2_ADS)				\
+__PMC_EV(P6, L2_DBUS_BUSY)			\
+__PMC_EV(P6, L2_DBUS_BUSY_RD)			\
+__PMC_EV(P6, BUS_DRDY_CLOCKS)			\
+__PMC_EV(P6, BUS_LOCK_CLOCKS)			\
+__PMC_EV(P6, BUS_REQ_OUTSTANDING)		\
+__PMC_EV(P6, BUS_TRAN_BRD)			\
+__PMC_EV(P6, BUS_TRAN_RFO)			\
+__PMC_EV(P6, BUS_TRANS_WB)			\
+__PMC_EV(P6, BUS_TRAN_IFETCH)			\
+__PMC_EV(P6, BUS_TRAN_INVAL)			\
+__PMC_EV(P6, BUS_TRAN_PWR)			\
+__PMC_EV(P6, BUS_TRANS_P)			\
+__PMC_EV(P6, BUS_TRANS_IO)			\
+__PMC_EV(P6, BUS_TRAN_DEF)			\
+__PMC_EV(P6, BUS_TRAN_BURST)			\
+__PMC_EV(P6, BUS_TRAN_ANY)			\
+__PMC_EV(P6, BUS_TRAN_MEM)			\
+__PMC_EV(P6, BUS_DATA_RCV)			\
+__PMC_EV(P6, BUS_BNR_DRV)			\
+__PMC_EV(P6, BUS_HIT_DRV)			\
+__PMC_EV(P6, BUS_HITM_DRV)			\
+__PMC_EV(P6, BUS_SNOOP_STALL)			\
+__PMC_EV(P6, FLOPS)				\
+__PMC_EV(P6, FP_COMPS_OPS_EXE)			\
+__PMC_EV(P6, FP_ASSIST)				\
+__PMC_EV(P6, MUL)				\
+__PMC_EV(P6, DIV)				\
+__PMC_EV(P6, CYCLES_DIV_BUSY)			\
+__PMC_EV(P6, LD_BLOCKS)				\
+__PMC_EV(P6, SB_DRAINS)				\
+__PMC_EV(P6, MISALIGN_MEM_REF)			\
+__PMC_EV(P6, EMON_KNI_PREF_DISPATCHED)		\
+__PMC_EV(P6, EMON_KNI_PREF_MISS)		\
+__PMC_EV(P6, INST_RETIRED)			\
+__PMC_EV(P6, UOPS_RETIRED)			\
+__PMC_EV(P6, INST_DECODED)			\
+__PMC_EV(P6, EMON_KNI_INST_RETIRED)		\
+__PMC_EV(P6, EMON_KNI_COMP_INST_RET)		\
+__PMC_EV(P6, HW_INT_RX)				\
+__PMC_EV(P6, CYCLES_INT_MASKED)			\
+__PMC_EV(P6, CYCLES_INT_PENDING_AND_MASKED)	\
+__PMC_EV(P6, BR_INST_RETIRED)			\
+__PMC_EV(P6, BR_MISS_PRED_RETIRED)		\
+__PMC_EV(P6, BR_TAKEN_RETIRED)			\
+__PMC_EV(P6, BR_MISS_PRED_TAKEN_RET)		\
+__PMC_EV(P6, BR_INST_DECODED)			\
+__PMC_EV(P6, BTB_MISSES)			\
+__PMC_EV(P6, BR_BOGUS)				\
+__PMC_EV(P6, BACLEARS)				\
+__PMC_EV(P6, RESOURCE_STALLS)			\
+__PMC_EV(P6, PARTIAL_RAT_STALLS)		\
+__PMC_EV(P6, SEGMENT_REG_LOADS)			\
+__PMC_EV(P6, CPU_CLK_UNHALTED)			\
+__PMC_EV(P6, MMX_INSTR_EXEC)			\
+__PMC_EV(P6, MMX_SAT_INSTR_EXEC)		\
+__PMC_EV(P6, MMX_UOPS_EXEC)			\
+__PMC_EV(P6, MMX_INSTR_TYPE_EXEC)		\
+__PMC_EV(P6, FP_MMX_TRANS)			\
+__PMC_EV(P6, MMX_ASSIST)			\
+__PMC_EV(P6, MMX_INSTR_RET)			\
+__PMC_EV(P6, SEG_RENAME_STALLS)			\
+__PMC_EV(P6, SEG_REG_RENAMES)			\
+__PMC_EV(P6, RET_SEG_RENAMES)			\
+__PMC_EV(P6, EMON_EST_TRANS)			\
+__PMC_EV(P6, EMON_THERMAL_TRIP)			\
+__PMC_EV(P6, BR_INST_EXEC)			\
+__PMC_EV(P6, BR_MISSP_EXEC)			\
+__PMC_EV(P6, BR_BAC_MISSP_EXEC)			\
+__PMC_EV(P6, BR_CND_EXEC)			\
+__PMC_EV(P6, BR_CND_MISSP_EXEC)			\
+__PMC_EV(P6, BR_IND_EXEC)			\
+__PMC_EV(P6, BR_IND_MISSP_EXEC)			\
+__PMC_EV(P6, BR_RET_EXEC)			\
+__PMC_EV(P6, BR_RET_MISSP_EXEC)			\
+__PMC_EV(P6, BR_RET_BAC_MISSP_EXEC)		\
+__PMC_EV(P6, BR_CALL_EXEC)			\
+__PMC_EV(P6, BR_CALL_MISSP_EXEC)		\
+__PMC_EV(P6, BR_IND_CALL_EXEC)			\
+__PMC_EV(P6, EMON_SIMD_INSTR_RETIRED)		\
+__PMC_EV(P6, EMON_SYNCH_UOPS)			\
+__PMC_EV(P6, EMON_ESP_UOPS)			\
+__PMC_EV(P6, EMON_FUSED_UOPS_RET)		\
+__PMC_EV(P6, EMON_UNFUSION)			\
+__PMC_EV(P6, EMON_PREF_RQSTS_UP)		\
+__PMC_EV(P6, EMON_PREF_RQSTS_DN)		\
+__PMC_EV(P6, EMON_SSE_SSE2_INST_RETIRED)	\
+__PMC_EV(P6, EMON_SSE_SSE2_COMP_INST_RETIRED)
 
 
 #define	PMC_EV_P6_FIRST	PMC_EV_P6_DATA_MEM_REFS
@@ -250,137 +241,86 @@ __PMC_EV(P6, EMON_SSE_SSE2_COMP_INST_RET
 /* AMD K8 PMCs */
 
 #define	__PMC_EV_K8()							\
-__PMC_EV(K8, FP_DISPATCHED_FPU_OPS,	k8-fp-dispatched-fpu-ops)	\
-__PMC_EV(K8, FP_CYCLES_WITH_NO_FPU_OPS_RETIRED,				\
-		k8-fp-cycles-with-no-fpu-ops-retired)			\
-__PMC_EV(K8, FP_DISPATCHED_FPU_FAST_FLAG_OPS,				\
-		k8-fp-dispatched-fpu-fast-flag-ops)			\
-__PMC_EV(K8, LS_SEGMENT_REGISTER_LOAD,	k8-ls-segment-register-load)	\
-__PMC_EV(K8, LS_MICROARCHITECTURAL_RESYNC_BY_SELF_MODIFYING_CODE,	\
-		k8-ls-microarchitectural-resync-by-self-modifying-code)	\
-__PMC_EV(K8, LS_MICROARCHITECTURAL_RESYNC_BY_SNOOP,			\
-		k8-ls-microarchitectural-resync-by-snoop)		\
-__PMC_EV(K8, LS_BUFFER2_FULL,		k8-ls-buffer2-full)		\
-__PMC_EV(K8, LS_LOCKED_OPERATION,	k8-ls-locked-operation)		\
-__PMC_EV(K8, LS_MICROARCHITECTURAL_LATE_CANCEL,				\
-		k8-ls-microarchitectural-late-cancel)			\
-__PMC_EV(K8, LS_RETIRED_CFLUSH_INSTRUCTIONS,				\
-		k8-ls-retired-cflush-instructions)			\

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-all mailing list