Files
Anderson Nascimento 5369f8e73e hwpmc: add MPERF/APERF MSR support for AMD/Intel CPUs
Add support for reading the MPERF (MSR 0xE7) and APERF (MSR 0xE8)
model-specific registers on AMD/Intel CPUs through hwpmc(4). These
counters track maximum and actual performance frequency respectively,
and are used to compute effective CPU frequency scaling independent
of the nominal TSC rate. The name of the class was chosen as PERF
because later support for other PERF MSRs can be added to the same
class.

Extend libpmc(3) to expose the AMD/Intel MPERF/APERF counters added
to hwpmc(4) in the companion kernel change, so userland consumers
(pmcstat(8), etc.) can allocate and read these events by name.

Document the new PERF class and its MPERF/APERF counters in a new
pmc.perf.3 manual page, describing their semantics and how to read
them via pmc(3) and pmcstat(8).

Bump PMC_VERSION_MINOR.

Signed-off-by:	Anderson Nascimento <[email protected]>
Reviewed by:	Ali Mashtizadeh <[email protected]>, mhorne
Reviewed by:	ziaee (manpages)
Sponsored by:	AMD
Differential Revision:	https://reviews.freebsd.org/D58647
2026-09-09 11:42:58 -03:00

122 lines
2.9 KiB
Makefile

PACKAGE=pmc
LIB_CXX=pmc
SRCS= libpmc.c pmclog.c libpmc_pmu_util.c libpmc_json.cc
INCS= pmc.h pmclog.h pmcformat.h
CFLAGS+= -I${SRCTOP}/${RELDIR:H}/libpmcstat
.if ${MACHINE_CPUARCH} == "aarch64"
EVENT_ARCH="arm64"
.elif ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
EVENT_ARCH="x86"
.elif ${MACHINE_CPUARCH} == "powerpc" && ${MACHINE_ARCH:Mpowerpc64*} != ""
EVENT_ARCH="powerpc"
.else
# This will generate an empty events table
EVENT_ARCH="none"
.endif
.if ${MK_DIRDEPS_BUILD} == "yes"
# avoid circular dependency
GENDIRDEPS_FILTER+= N${RELDIR:H}/libpmcstat
JEVENTS?= ${HOST_OBJTOP}/${RELDIR}/pmu-events/jevents
.else
JEVENTS= ${BTOOLSPATH:U.}/pmu-events/jevents
# This file is built in a subdirectory so never try to rebuild it here.
${JEVENTS}: .PHONY
.if make(*clean*)
SUBDIR+= pmu-events
.endif
.endif
libpmc_events.c: ${JEVENTS} .META
${JEVENTS} ${EVENT_ARCH} ${.CURDIR}/pmu-events/arch ${.TARGET}.tmp
if [ ! -e ${.TARGET} ] || ! cmp -s ${.TARGET} ${.TARGET}.tmp; then \
mv -f ${.TARGET}.tmp ${.TARGET}; \
fi
CLEANFILES+= libpmc_events.c libpmc_events.c.tmp
SRCS+= libpmc_events.c
WARNS?= 3
CFLAGS+= -I${.CURDIR} -I${SRCTOP}/sys
CWARNFLAGS.gcc+= -Wno-shadow -Wno-cast-align
MAN= pmc.3
MAN+= pmc_allocate.3
MAN+= pmc_attach.3
MAN+= pmc_capabilities.3
MAN+= pmc_configure_logfile.3
MAN+= pmc_disable.3
MAN+= pmc_event_names_of_class.3
MAN+= pmc_get_driver_stats.3
MAN+= pmc_get_msr.3
MAN+= pmc_init.3
MAN+= pmc_name_of_capability.3
MAN+= pmc_read.3
MAN+= pmc_set.3
MAN+= pmc_start.3
MAN+= pmclog.3
MAN+= pmc.soft.3
# PMC-dependent manual pages
MAN+= pmc.amd.3
MAN+= pmc.atom.3
MAN+= pmc.atomsilvermont.3
MAN+= pmc.cmn-600.3
MAN+= pmc.core.3
MAN+= pmc.core2.3
MAN+= pmc.corei7.3
MAN+= pmc.corei7uc.3
MAN+= pmc.dmc-620.3
MAN+= pmc.haswell.3
MAN+= pmc.haswelluc.3
MAN+= pmc.haswellxeon.3
MAN+= pmc.iaf.3
MAN+= pmc.ibs.3
MAN+= pmc.ivybridge.3
MAN+= pmc.ivybridgexeon.3
MAN+= pmc.perf.3
MAN+= pmc.rapl.3
MAN+= pmc.sandybridge.3
MAN+= pmc.sandybridgeuc.3
MAN+= pmc.sandybridgexeon.3
MAN+= pmc.tsc.3
MAN+= pmc.ucf.3
MAN+= pmc.westmere.3
MAN+= pmc.westmereuc.3
MLINKS+= \
pmc_allocate.3 pmc_release.3 \
pmc_attach.3 pmc_detach.3 \
pmc_capabilities.3 pmc_ncpu.3 \
pmc_capabilities.3 pmc_npmc.3 \
pmc_capabilities.3 pmc_pmcinfo.3 \
pmc_capabilities.3 pmc_cpuinfo.3 \
pmc_capabilities.3 pmc_width.3 \
pmc_configure_logfile.3 pmc_flush_logfile.3 \
pmc_configure_logfile.3 pmc_writelog.3 \
pmc_disable.3 pmc_enable.3 \
pmc_name_of_capability.3 pmc_name_of_class.3 \
pmc_name_of_capability.3 pmc_name_of_cputype.3 \
pmc_name_of_capability.3 pmc_name_of_disposition.3 \
pmc_name_of_capability.3 pmc_name_of_event.3 \
pmc_name_of_capability.3 pmc_name_of_mode.3 \
pmc_name_of_capability.3 pmc_name_of_state.3 \
pmc_read.3 pmc_rw.3 \
pmc_read.3 pmc_write.3 \
pmc_start.3 pmc_stop.3
MLINKS+= \
pmclog.3 pmclog_open.3 \
pmclog.3 pmclog_close.3 \
pmclog.3 pmclog_feed.3 \
pmclog.3 pmclog_read.3
# Class aliases
MLINKS+= \
pmc.amd.3 pmc.k8.3
.include <bsd.lib.mk>