svn commit: r228438 - head/sys/dev/hwpmc
Fabien Thomas
fabient at FreeBSD.org
Mon Dec 12 13:12:55 UTC 2011
Author: fabient
Date: Mon Dec 12 13:12:55 2011
New Revision: 228438
URL: http://svn.freebsd.org/changeset/base/228438
Log:
There's a small set of events on Nehalem, that are not supported in
processors with CPUID signature 06_1AH, 06_1EH, and 06_1FH.
Refuse to allocate them on unsupported model.
Submitted by: Davide Italiano <davide.italiano at gmail.com>
MFC after: 1 month
Modified:
head/sys/dev/hwpmc/hwpmc_core.c
Modified: head/sys/dev/hwpmc/hwpmc_core.c
==============================================================================
--- head/sys/dev/hwpmc/hwpmc_core.c Mon Dec 12 12:33:38 2011 (r228437)
+++ head/sys/dev/hwpmc/hwpmc_core.c Mon Dec 12 13:12:55 2011 (r228438)
@@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$");
#include <machine/apicvar.h>
#include <machine/cpu.h>
#include <machine/cpufunc.h>
+#include <machine/md_var.h>
#include <machine/specialreg.h>
#define CORE_CPUID_REQUEST 0xA
@@ -1553,7 +1554,7 @@ static int
iap_allocate_pmc(int cpu, int ri, struct pmc *pm,
const struct pmc_op_pmcallocate *a)
{
- int n;
+ int n, model;
enum pmc_event ev;
struct iap_event_descr *ie;
uint32_t c, caps, config, cpuflag, evsel, mask;
@@ -1573,6 +1574,16 @@ iap_allocate_pmc(int cpu, int ri, struct
if (iap_architectural_event_is_unsupported(ev))
return (EOPNOTSUPP);
+ /*
+ * A small number of events are not supported in all the
+ * processors based on a given microarchitecture.
+ */
+ if (ev == PMC_EV_IAP_EVENT_0FH_01H || ev == PMC_EV_IAP_EVENT_0FH_80H) {
+ model = ((cpu_id & 0xF0000) >> 12) | ((cpu_id & 0xF0) >> 4);
+ if (core_cputype == PMC_CPU_INTEL_COREI7 && model != 0x2E)
+ return (EINVAL);
+ }
+
switch (core_cputype) {
case PMC_CPU_INTEL_COREI7:
if (iap_event_corei7_ok_on_counter(ev, ri) == 0)
More information about the svn-src-head
mailing list