|
Packit Service |
a1973e |
/* $Id: libperfctr.h,v 1.50 2007/10/06 13:02:07 mikpe Exp $
|
|
Packit Service |
a1973e |
* Library interface to Linux Performance-Monitoring Counters.
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Copyright (C) 1999-2007 Mikael Pettersson
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#ifndef __LIB_PERFCTR_H
|
|
Packit Service |
a1973e |
#define __LIB_PERFCTR_H
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* The kernel/user-space API structures are not suitable
|
|
Packit Service |
a1973e |
* for applications, so we need to provide some wrappers.
|
|
Packit Service |
a1973e |
* This being the case, the wrappers may as well be
|
|
Packit Service |
a1973e |
* compatible with perfctr-2.6.x.
|
|
Packit Service |
a1973e |
*
|
|
Packit Service |
a1973e |
* Import the kernel/user-space API definitions, but
|
|
Packit Service |
a1973e |
* rename some of them to avoid conflicts with the
|
|
Packit Service |
a1973e |
* (simulated) perfctr-2.6.x API.
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
#define CONFIG_PERFCTR 1
|
|
Packit Service |
a1973e |
#define vperfctr_control vperfctr_control_kernel
|
|
Packit Service |
a1973e |
#define perfctr_cpu_control perfctr_cpu_control_kernel
|
|
Packit Service |
a1973e |
#include <linux/perfctr.h>
|
|
Packit Service |
a1973e |
#undef CONFIG_PERFCTR
|
|
Packit Service |
a1973e |
#undef vperfctr_control
|
|
Packit Service |
a1973e |
#undef perfctr_cpu_control
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#include <stdint.h>
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#if defined(__i386__) || defined(__x86_64__)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* cpu_type values */
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_GENERIC 0 /* any x86 with rdtsc */
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_INTEL_P5 1 /* no rdpmc */
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_INTEL_P5MMX 2
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_INTEL_P6 3
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_INTEL_PII 4
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_INTEL_PIII 5
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_CYRIX_MII 6
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_WINCHIP_C6 7 /* no rdtsc */
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_WINCHIP_2 8 /* no rdtsc */
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_AMD_K7 9
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_VIA_C3 10 /* no pmc0 */
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_INTEL_P4 11 /* model 0 and 1 */
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_INTEL_P4M2 12 /* model 2 */
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_AMD_K8 13
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_INTEL_PENTM 14 /* Pentium M */
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_AMD_K8C 15 /* Revision C */
|
|
Packit Service |
a1973e |
#define PERFCTR_X86_INTEL_P4M3 16 /* model 3 and above */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct perfctr_cpu_control {
|
|
Packit Service |
a1973e |
unsigned int tsc_on;
|
|
Packit Service |
a1973e |
unsigned int nractrs; /* # of a-mode counters */
|
|
Packit Service |
a1973e |
unsigned int nrictrs; /* # of i-mode counters */
|
|
Packit Service |
a1973e |
unsigned int pmc_map[18];
|
|
Packit Service |
a1973e |
unsigned int evntsel[18]; /* one per counter, even on P5 */
|
|
Packit Service |
a1973e |
struct {
|
|
Packit Service |
a1973e |
unsigned int escr[18];
|
|
Packit Service |
a1973e |
unsigned int pebs_enable; /* for replay tagging */
|
|
Packit Service |
a1973e |
unsigned int pebs_matrix_vert; /* for replay tagging */
|
|
Packit Service |
a1973e |
} p4;
|
|
Packit Service |
a1973e |
int ireset[18]; /* < 0, for i-mode counters */
|
|
Packit Service |
a1973e |
unsigned int _reserved1;
|
|
Packit Service |
a1973e |
unsigned int _reserved2;
|
|
Packit Service |
a1973e |
unsigned int _reserved3;
|
|
Packit Service |
a1973e |
unsigned int _reserved4;
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* version number for user-visible CPU-specific data */
|
|
Packit Service |
a1973e |
#define PERFCTR_CPU_VERSION 0x0500 /* 5.0 */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#endif /* __i386__ || __x86_64__ */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#if defined(__powerpc64__) || defined(PPC64)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* perfctr_info.cpu_type values */
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC64_GENERIC 0
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC64_POWER4 1
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC64_POWER4p 2
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC64_970 3
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC64_POWER5 4
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC64_970MP 5
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct perfctr_cpu_control {
|
|
Packit Service |
a1973e |
unsigned int tsc_on;
|
|
Packit Service |
a1973e |
unsigned int nractrs; /* # of a-mode counters */
|
|
Packit Service |
a1973e |
unsigned int nrictrs; /* # of i-mode counters */
|
|
Packit Service |
a1973e |
unsigned int pmc_map[8];
|
|
Packit Service |
a1973e |
int ireset[8]; /* [0,0x7fffffff], for i-mode counters */
|
|
Packit Service |
a1973e |
struct {
|
|
Packit Service |
a1973e |
uint32_t mmcr0, mmcra;
|
|
Packit Service |
a1973e |
uint64_t mmcr1;
|
|
Packit Service |
a1973e |
} ppc64;
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* version number for user-visible CPU-specific data */
|
|
Packit Service |
a1973e |
#define PERFCTR_CPU_VERSION 0 /* XXX: not yet cast in stone */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#elif defined(__powerpc__)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* perfctr_info.cpu_type values */
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC_GENERIC 0
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC_604 1
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC_604e 2
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC_750 3
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC_7400 4
|
|
Packit Service |
a1973e |
#define PERFCTR_PPC_7450 5
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct perfctr_cpu_control {
|
|
Packit Service |
a1973e |
unsigned int tsc_on;
|
|
Packit Service |
a1973e |
unsigned int nractrs; /* # of a-mode counters */
|
|
Packit Service |
a1973e |
unsigned int nrictrs; /* # of i-mode counters */
|
|
Packit Service |
a1973e |
unsigned int pmc_map[6];
|
|
Packit Service |
a1973e |
unsigned int evntsel[6]; /* one per counter, even on P5 */
|
|
Packit Service |
a1973e |
int ireset[6]; /* [0,0x7fffffff], for i-mode counters */
|
|
Packit Service |
a1973e |
struct {
|
|
Packit Service |
a1973e |
unsigned int mmcr0; /* sans PMC{1,2}SEL */
|
|
Packit Service |
a1973e |
unsigned int mmcr2; /* only THRESHMULT */
|
|
Packit Service |
a1973e |
/* IABR/DABR/BAMR not supported */
|
|
Packit Service |
a1973e |
} ppc;
|
|
Packit Service |
a1973e |
unsigned int _reserved1;
|
|
Packit Service |
a1973e |
unsigned int _reserved2;
|
|
Packit Service |
a1973e |
unsigned int _reserved3;
|
|
Packit Service |
a1973e |
unsigned int _reserved4;
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* version number for user-visible CPU-specific data */
|
|
Packit Service |
a1973e |
#define PERFCTR_CPU_VERSION 0 /* XXX: not yet cast in stone */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#endif /* __powerpc__ && !(__powerpc64__ || PPC64)*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct perfctr_info {
|
|
Packit Service |
a1973e |
unsigned int abi_version;
|
|
Packit Service |
a1973e |
char driver_version[32];
|
|
Packit Service |
a1973e |
unsigned int cpu_type;
|
|
Packit Service |
a1973e |
unsigned int cpu_features;
|
|
Packit Service |
a1973e |
unsigned int cpu_khz;
|
|
Packit Service |
a1973e |
unsigned int tsc_to_cpu_mult;
|
|
Packit Service |
a1973e |
unsigned int _reserved2;
|
|
Packit Service |
a1973e |
unsigned int _reserved3;
|
|
Packit Service |
a1973e |
unsigned int _reserved4;
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct perfctr_cpu_mask {
|
|
Packit Service |
a1973e |
unsigned int nrwords;
|
|
Packit Service |
a1973e |
unsigned int mask[1]; /* actually 'nrwords' */
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* abi_version values: Lower 16 bits contain the CPU data version, upper
|
|
Packit Service |
a1973e |
16 bits contain the API version. Each half has a major version in its
|
|
Packit Service |
a1973e |
upper 8 bits, and a minor version in its lower 8 bits. */
|
|
Packit Service |
a1973e |
#define PERFCTR_API_VERSION 0x0600 /* 6.0 */
|
|
Packit Service |
a1973e |
#define PERFCTR_ABI_VERSION ((PERFCTR_API_VERSION<<16)|PERFCTR_CPU_VERSION)
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct vperfctr_control {
|
|
Packit Service |
a1973e |
int si_signo;
|
|
Packit Service |
a1973e |
struct perfctr_cpu_control cpu_control;
|
|
Packit Service |
a1973e |
unsigned int preserve;
|
|
Packit Service |
a1973e |
unsigned int _reserved1;
|
|
Packit Service |
a1973e |
unsigned int _reserved2;
|
|
Packit Service |
a1973e |
unsigned int _reserved3;
|
|
Packit Service |
a1973e |
unsigned int _reserved4;
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct perfctr_cpus_info { /* malloc():d, use free() */
|
|
Packit Service |
a1973e |
struct perfctr_cpu_mask *cpus;
|
|
Packit Service |
a1973e |
struct perfctr_cpu_mask *cpus_forbidden;
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Library-internal procedures.
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
int _sys_perfctr_info(int fd, struct perfctr_info*, struct perfctr_cpu_mask*, struct perfctr_cpu_mask*);
|
|
Packit Service |
a1973e |
int _sys_vperfctr_open(int fd, int tid, int creat);
|
|
Packit Service |
a1973e |
int _sys_vperfctr_write_control(int fd, unsigned int cpu_type, const struct vperfctr_control*);
|
|
Packit Service |
a1973e |
int _sys_vperfctr_read_control(int fd, unsigned int cpu_type, struct vperfctr_control*);
|
|
Packit Service |
a1973e |
int _sys_vperfctr_read_sum(int fd, struct perfctr_sum_ctrs*);
|
|
Packit Service |
a1973e |
int _sys_vperfctr_read_children(int fd, struct perfctr_sum_ctrs*);
|
|
Packit Service |
a1973e |
int _sys_vperfctr_unlink(int fd);
|
|
Packit Service |
a1973e |
int _sys_vperfctr_iresume(int fd);
|
|
Packit Service |
a1973e |
int _perfctr_get_state_user_offset(void);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Operations on the process' own virtual-mode perfctrs.
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int _vperfctr_open(int creat);
|
|
Packit Service |
a1973e |
int _vperfctr_control(int fd, const struct vperfctr_control*); /* XXX: should take cpu_type too */
|
|
Packit Service |
a1973e |
int _vperfctr_read_control(int fd, struct vperfctr_control*); /* XXX: should take cpu_type too */
|
|
Packit Service |
a1973e |
int _vperfctr_read_sum(int fd, struct perfctr_sum_ctrs*);
|
|
Packit Service |
a1973e |
int _vperfctr_read_children(int fd, struct perfctr_sum_ctrs*);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct vperfctr; /* opaque */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct vperfctr *vperfctr_open(void);
|
|
Packit Service |
a1973e |
int vperfctr_info(const struct vperfctr*, struct perfctr_info*);
|
|
Packit Service |
a1973e |
struct perfctr_cpus_info *vperfctr_cpus_info(const struct vperfctr*);
|
|
Packit Service |
a1973e |
unsigned long long vperfctr_read_tsc(const struct vperfctr*);
|
|
Packit Service |
a1973e |
unsigned long long vperfctr_read_pmc(const struct vperfctr*, unsigned);
|
|
Packit Service |
a1973e |
int vperfctr_read_ctrs(const struct vperfctr*, struct perfctr_sum_ctrs*);
|
|
Packit Service |
a1973e |
int vperfctr_read_state(const struct vperfctr*, struct perfctr_sum_ctrs*,
|
|
Packit Service |
a1973e |
struct vperfctr_control*);
|
|
Packit Service |
a1973e |
int vperfctr_control(struct vperfctr*, struct vperfctr_control*);
|
|
Packit Service |
a1973e |
int vperfctr_stop(struct vperfctr*);
|
|
Packit Service |
a1973e |
int vperfctr_is_running(const struct vperfctr*);
|
|
Packit Service |
a1973e |
int vperfctr_iresume(const struct vperfctr*);
|
|
Packit Service |
a1973e |
int vperfctr_unlink(const struct vperfctr*);
|
|
Packit Service |
a1973e |
void vperfctr_close(struct vperfctr*);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Operations on other processes' virtual-mode perfctrs.
|
|
Packit Service |
a1973e |
* (Preliminary, subject to change.)
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct rvperfctr; /* opaque */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct rvperfctr *rvperfctr_open(int pid);
|
|
Packit Service |
a1973e |
int rvperfctr_pid(const struct rvperfctr*);
|
|
Packit Service |
a1973e |
int rvperfctr_info(const struct rvperfctr*, struct perfctr_info*);
|
|
Packit Service |
a1973e |
int rvperfctr_read_ctrs(const struct rvperfctr*, struct perfctr_sum_ctrs*);
|
|
Packit Service |
a1973e |
int rvperfctr_read_state(const struct rvperfctr*, struct perfctr_sum_ctrs*,
|
|
Packit Service |
a1973e |
struct vperfctr_control*);
|
|
Packit Service |
a1973e |
int rvperfctr_control(struct rvperfctr*, struct vperfctr_control*);
|
|
Packit Service |
a1973e |
int rvperfctr_stop(struct rvperfctr*);
|
|
Packit Service |
a1973e |
int rvperfctr_unlink(const struct rvperfctr*);
|
|
Packit Service |
a1973e |
void rvperfctr_close(struct rvperfctr*);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Operations on global-mode perfctrs.
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
#if 0 /* disabled pending reimplementation of kernel support */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct gperfctr; /* opaque */
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct gperfctr *gperfctr_open(void);
|
|
Packit Service |
a1973e |
void gperfctr_close(struct gperfctr*);
|
|
Packit Service |
a1973e |
int gperfctr_control(const struct gperfctr*, struct gperfctr_cpu_control*);
|
|
Packit Service |
a1973e |
int gperfctr_read(const struct gperfctr*, struct gperfctr_cpu_state*);
|
|
Packit Service |
a1973e |
int gperfctr_stop(const struct gperfctr*);
|
|
Packit Service |
a1973e |
int gperfctr_start(const struct gperfctr*, unsigned int interval_usec);
|
|
Packit Service |
a1973e |
int gperfctr_info(const struct gperfctr*, struct perfctr_info*);
|
|
Packit Service |
a1973e |
struct perfctr_cpus_info *gperfctr_cpus_info(const struct gperfctr*);
|
|
Packit Service |
a1973e |
#endif
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Descriptions of the events available for different processor types.
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
enum perfctr_unit_mask_type {
|
|
Packit Service |
a1973e |
perfctr_um_type_fixed, /* one fixed (required) value */
|
|
Packit Service |
a1973e |
perfctr_um_type_exclusive, /* exactly one of N values */
|
|
Packit Service |
a1973e |
perfctr_um_type_bitmask, /* bitwise 'or' of N power-of-2 values */
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct perfctr_unit_mask_value {
|
|
Packit Service |
a1973e |
unsigned int value;
|
|
Packit Service |
a1973e |
const char *description; /* [NAME:]text */
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct perfctr_unit_mask {
|
|
Packit Service |
a1973e |
unsigned short default_value;
|
|
Packit Service |
a1973e |
enum perfctr_unit_mask_type type:8;
|
|
Packit Service |
a1973e |
unsigned char nvalues;
|
|
Packit Service |
a1973e |
struct perfctr_unit_mask_value values[1/*nvalues*/];
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct perfctr_event {
|
|
Packit Service |
a1973e |
unsigned short evntsel;
|
|
Packit Service |
a1973e |
unsigned short counters_set; /* P4 force this to be CPU-specific */
|
|
Packit Service |
a1973e |
const struct perfctr_unit_mask *unit_mask;
|
|
Packit Service |
a1973e |
const char *name;
|
|
Packit Service |
a1973e |
const char *description;
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
struct perfctr_event_set {
|
|
Packit Service |
a1973e |
unsigned int cpu_type;
|
|
Packit Service |
a1973e |
const char *event_prefix;
|
|
Packit Service |
a1973e |
const struct perfctr_event_set *include;
|
|
Packit Service |
a1973e |
unsigned int nevents;
|
|
Packit Service |
a1973e |
const struct perfctr_event *events;
|
|
Packit Service |
a1973e |
};
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
const struct perfctr_event_set *perfctr_cpu_event_set(unsigned int cpu_type);
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/*
|
|
Packit Service |
a1973e |
* Miscellaneous operations.
|
|
Packit Service |
a1973e |
*/
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
/* this checks the ABI between library and kernel -- it can also
|
|
Packit Service |
a1973e |
be used by applications operating on raw file descriptors */
|
|
Packit Service |
a1973e |
int _perfctr_abi_check_fd(int fd, unsigned int user_abi_version);
|
|
Packit Service |
a1973e |
static __inline__ int perfctr_abi_check_fd(int fd)
|
|
Packit Service |
a1973e |
{
|
|
Packit Service |
a1973e |
return _perfctr_abi_check_fd(fd, PERFCTR_ABI_VERSION);
|
|
Packit Service |
a1973e |
}
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
int perfctr_info(int fd, struct perfctr_info *info);
|
|
Packit Service |
a1973e |
struct perfctr_cpus_info *perfctr_cpus_info(int fd);
|
|
Packit Service |
a1973e |
unsigned int perfctr_info_nrctrs(const struct perfctr_info*);
|
|
Packit Service |
a1973e |
const char *perfctr_info_cpu_name(const struct perfctr_info*);
|
|
Packit Service |
a1973e |
void perfctr_info_print(const struct perfctr_info*);
|
|
Packit Service |
a1973e |
void perfctr_cpus_info_print(const struct perfctr_cpus_info*);
|
|
Packit Service |
a1973e |
void perfctr_cpu_control_print(const struct perfctr_cpu_control*);
|
|
Packit Service |
a1973e |
unsigned int perfctr_linux_version_code(void);
|
|
Packit Service |
a1973e |
#define PERFCTR_KERNEL_VERSION(v,p,s) (((v) << 16) + ((p) << 8) + (s))
|
|
Packit Service |
a1973e |
|
|
Packit Service |
a1973e |
#endif /* __LIB_PERFCTR_H */
|