Blame src/perfctr-2.7.x/usr.lib/libperfctr.h

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 */