summaryrefslogtreecommitdiffstats
path: root/sys/dev/hwpmc/hwpmc_x86.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/hwpmc/hwpmc_x86.c')
-rw-r--r--sys/dev/hwpmc/hwpmc_x86.c131
1 files changed, 15 insertions, 116 deletions
diff --git a/sys/dev/hwpmc/hwpmc_x86.c b/sys/dev/hwpmc/hwpmc_x86.c
index 66bf8dd..dd9c0e9 100644
--- a/sys/dev/hwpmc/hwpmc_x86.c
+++ b/sys/dev/hwpmc/hwpmc_x86.c
@@ -240,120 +240,6 @@ pmc_save_kernel_callchain(uintptr_t *cc, int nframes, struct trapframe *tf)
return (n);
}
-static struct pmc_mdep *
-pmc_intel_initialize(void)
-{
- struct pmc_mdep *pmc_mdep;
- enum pmc_cputype cputype;
- int error, model;
-
- KASSERT(strcmp(cpu_vendor, "GenuineIntel") == 0,
- ("[intel,%d] Initializing non-intel processor", __LINE__));
-
- PMCDBG(MDP,INI,0, "intel-initialize cpuid=0x%x", cpu_id);
-
- cputype = -1;
-
- switch (cpu_id & 0xF00) {
-#if defined(__i386__)
- case 0x500: /* Pentium family processors */
- cputype = PMC_CPU_INTEL_P5;
- break;
- case 0x600: /* Pentium Pro, Celeron, Pentium II & III */
- switch ((cpu_id & 0xF0) >> 4) { /* model number field */
- case 0x1:
- cputype = PMC_CPU_INTEL_P6;
- break;
- case 0x3: case 0x5:
- cputype = PMC_CPU_INTEL_PII;
- break;
- case 0x6:
- cputype = PMC_CPU_INTEL_CL;
- break;
- case 0x7: case 0x8: case 0xA: case 0xB:
- cputype = PMC_CPU_INTEL_PIII;
- break;
- case 0x9: case 0xD:
- cputype = PMC_CPU_INTEL_PM;
- break;
- }
- break;
-#endif
-#if defined(__i386__) || defined(__amd64__)
- case 0xF00: /* P4 */
- model = ((cpu_id & 0xF0000) >> 12) | ((cpu_id & 0xF0) >> 4);
- if (model >= 0 && model <= 6) /* known models */
- cputype = PMC_CPU_INTEL_PIV;
- break;
- }
-#endif
-
- if ((int) cputype == -1) {
- printf("pmc: Unknown Intel CPU.\n");
- return NULL;
- }
-
- pmc_mdep = malloc(sizeof(struct pmc_mdep),
- M_PMC, M_WAITOK|M_ZERO);
-
- pmc_mdep->pmd_cputype = cputype;
- pmc_mdep->pmd_nclass = 2;
- pmc_mdep->pmd_classes[0].pm_class = PMC_CLASS_TSC;
- pmc_mdep->pmd_classes[0].pm_caps = PMC_CAP_READ;
- pmc_mdep->pmd_classes[0].pm_width = 64;
- pmc_mdep->pmd_nclasspmcs[0] = 1;
-
- error = 0;
-
- switch (cputype) {
-
-#if defined(__i386__) || defined(__amd64__)
-
- /*
- * Intel Pentium 4 Processors, and P4/EMT64 processors.
- */
-
- case PMC_CPU_INTEL_PIV:
- error = pmc_initialize_p4(pmc_mdep);
- break;
-#endif
-
-#if defined(__i386__)
- /*
- * P6 Family Processors
- */
-
- case PMC_CPU_INTEL_P6:
- case PMC_CPU_INTEL_CL:
- case PMC_CPU_INTEL_PII:
- case PMC_CPU_INTEL_PIII:
- case PMC_CPU_INTEL_PM:
-
- error = pmc_initialize_p6(pmc_mdep);
- break;
-
- /*
- * Intel Pentium PMCs.
- */
-
- case PMC_CPU_INTEL_P5:
- error = pmc_initialize_p5(pmc_mdep);
- break;
-#endif
-
- default:
- KASSERT(0,("[intel,%d] Unknown CPU type", __LINE__));
- }
-
- if (error) {
- free(pmc_mdep, M_PMC);
- pmc_mdep = NULL;
- }
-
- return pmc_mdep;
-}
-
-
/*
* Machine dependent initialization for x86 class platforms.
*/
@@ -370,11 +256,24 @@ pmc_md_initialize()
md = pmc_amd_initialize();
else if (strcmp(cpu_vendor, "GenuineIntel") == 0)
md = pmc_intel_initialize();
+ else
+ KASSERT(0, ("[x86,%d] Unknown vendor", __LINE__));
/* disallow sampling if we do not have an LAPIC */
if (md != NULL && lapic == NULL)
for (i = 1; i < md->pmd_nclass; i++)
- md->pmd_classes[i].pm_caps &= ~PMC_CAP_INTERRUPT;
+ md->pmd_classdep[i].pcd_caps &= ~PMC_CAP_INTERRUPT;
+
+ return (md);
+}
- return md;
+void
+pmc_md_finalize(struct pmc_mdep *md)
+{
+ if (strcmp(cpu_vendor, "AuthenticAMD") == 0)
+ pmc_amd_finalize(md);
+ else if (strcmp(cpu_vendor, "GenuineIntel") == 0)
+ pmc_intel_finalize(md);
+ else
+ KASSERT(0, ("[x86,%d] Unknown vendor", __LINE__));
}
OpenPOWER on IntegriCloud