Blame src/perfctr-2.6.x/linux/include/asm-x86/perfctr.h

Packit Service a1973e
/* $Id: perfctr.h,v 1.1.2.16 2010/11/07 19:46:06 mikpe Exp $
Packit Service a1973e
 * x86/x86_64 Performance-Monitoring Counters driver
Packit Service a1973e
 *
Packit Service a1973e
 * Copyright (C) 1999-2010  Mikael Pettersson
Packit Service a1973e
 */
Packit Service a1973e
#ifndef _ASM_X86_PERFCTR_H
Packit Service a1973e
#define _ASM_X86_PERFCTR_H
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
#define PERFCTR_X86_INTEL_CORE	17	/* family 6 model 14 */
Packit Service a1973e
#define PERFCTR_X86_INTEL_CORE2	18	/* family 6, models 15, 22, 23, 29 */
Packit Service a1973e
#define PERFCTR_X86_AMD_FAM10H	19	/* family 10h, family 11h */
Packit Service a1973e
#define PERFCTR_X86_AMD_FAM10	PERFCTR_X86_AMD_FAM10H /* XXX: compat crap, delete soon */
Packit Service a1973e
#define PERFCTR_X86_INTEL_ATOM	20	/* family 6 model 28 */
Packit Service a1973e
#define PERFCTR_X86_INTEL_NHLM	21	/* Nehalem: family 6 models 26, 30, 46 */
Packit Service a1973e
#define PERFCTR_X86_INTEL_COREI7 PERFCTR_X86_INTEL_NHLM /* XXX: compat crap, delete soon */
Packit Service a1973e
#define PERFCTR_X86_INTEL_WSTMR	22	/* Westmere: family 6 models 37, 44 */
Packit Service a1973e
Packit Service a1973e
struct perfctr_sum_ctrs {
Packit Service a1973e
	unsigned long long tsc;
Packit Service a1973e
	unsigned long long pmc[18];
Packit Service a1973e
};
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
	union {
Packit Service a1973e
		/* Note: envtsel_high[] and p4.escr[] must occupy the same locations */
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
		unsigned int evntsel_high[18];
Packit Service a1973e
		/* Note: nhlm.offcore_rsp[] must not overlap evntsel_high[],
Packit Service a1973e
		   instead we make it overlap the p4.pebs_ fields */
Packit Service a1973e
		struct {
Packit Service a1973e
			unsigned int _padding[18];
Packit Service a1973e
			unsigned int offcore_rsp[2];
Packit Service a1973e
		} nhlm;
Packit Service a1973e
	}; /* XXX: should be a named field 'u', but that breaks source-code compatibility */
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
struct perfctr_cpu_state {
Packit Service a1973e
	unsigned int cstatus;
Packit Service a1973e
	struct {	/* k1 is opaque in the user ABI */
Packit Service a1973e
		unsigned int id;
Packit Service a1973e
		int isuspend_cpu;
Packit Service a1973e
	} k1;
Packit Service a1973e
	/* The two tsc fields must be inlined. Placing them in a
Packit Service a1973e
	   sub-struct causes unwanted internal padding on x86-64. */
Packit Service a1973e
	unsigned int tsc_start;
Packit Service a1973e
	unsigned long long tsc_sum;
Packit Service a1973e
	struct {
Packit Service a1973e
		unsigned int map;
Packit Service a1973e
		unsigned int start;
Packit Service a1973e
		unsigned long long sum;
Packit Service a1973e
	} pmc[18];	/* the size is not part of the user ABI */
Packit Service a1973e
#ifdef __KERNEL__
Packit Service a1973e
	struct perfctr_cpu_control control;
Packit Service a1973e
	unsigned int core2_fixed_ctr_ctrl;
Packit Service a1973e
	unsigned int p4_escr_map[18];
Packit Service a1973e
#ifdef CONFIG_PERFCTR_INTERRUPT_SUPPORT
Packit Service a1973e
	unsigned int pending_interrupt;
Packit Service a1973e
#endif
Packit Service a1973e
#endif
Packit Service a1973e
};
Packit Service a1973e
Packit Service a1973e
/* cstatus is a re-encoding of control.tsc_on/nractrs/nrictrs
Packit Service a1973e
   which should have less overhead in most cases */
Packit Service a1973e
Packit Service a1973e
static inline
Packit Service a1973e
unsigned int __perfctr_mk_cstatus(unsigned int tsc_on, unsigned int have_ictrs,
Packit Service a1973e
				  unsigned int nrictrs, unsigned int nractrs)
Packit Service a1973e
{
Packit Service a1973e
	return (tsc_on<<31) | (have_ictrs<<16) | ((nractrs+nrictrs)<<8) | nractrs;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static inline
Packit Service a1973e
unsigned int perfctr_mk_cstatus(unsigned int tsc_on, unsigned int nractrs,
Packit Service a1973e
				unsigned int nrictrs)
Packit Service a1973e
{
Packit Service a1973e
	return __perfctr_mk_cstatus(tsc_on, nrictrs, nrictrs, nractrs);
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static inline unsigned int perfctr_cstatus_enabled(unsigned int cstatus)
Packit Service a1973e
{
Packit Service a1973e
	return cstatus;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static inline int perfctr_cstatus_has_tsc(unsigned int cstatus)
Packit Service a1973e
{
Packit Service a1973e
	return (int)cstatus < 0;	/* test and jump on sign */
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static inline unsigned int perfctr_cstatus_nractrs(unsigned int cstatus)
Packit Service a1973e
{
Packit Service a1973e
	return cstatus & 0x7F;		/* and with imm8 */
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static inline unsigned int perfctr_cstatus_nrctrs(unsigned int cstatus)
Packit Service a1973e
{
Packit Service a1973e
	return (cstatus >> 8) & 0x7F;
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
static inline unsigned int perfctr_cstatus_has_ictrs(unsigned int cstatus)
Packit Service a1973e
{
Packit Service a1973e
	return cstatus & (0x7F << 16);
Packit Service a1973e
}
Packit Service a1973e
Packit Service a1973e
/*
Packit Service a1973e
 * 'struct siginfo' support for perfctr overflow signals.
Packit Service a1973e
 * In unbuffered mode, si_code is set to SI_PMC_OVF and a bitmask
Packit Service a1973e
 * describing which perfctrs overflowed is put in si_pmc_ovf_mask.
Packit Service a1973e
 * A bitmask is used since more than one perfctr can have overflowed
Packit Service a1973e
 * by the time the interrupt handler runs.
Packit Service a1973e
 *
Packit Service a1973e
 * glibc's <signal.h> doesn't seem to define __SI_FAULT or __SI_CODE(),
Packit Service a1973e
 * and including <asm/siginfo.h> as well may cause redefinition errors,
Packit Service a1973e
 * so the user and kernel values are different #defines here.
Packit Service a1973e
 */
Packit Service a1973e
#ifdef __KERNEL__
Packit Service a1973e
#define SI_PMC_OVF	(__SI_FAULT|'P')
Packit Service a1973e
#else
Packit Service a1973e
#define SI_PMC_OVF	('P')
Packit Service a1973e
#endif
Packit Service a1973e
#define si_pmc_ovf_mask	_sifields._pad[0] /* XXX: use an unsigned field later */
Packit Service a1973e
Packit Service a1973e
/* version number for user-visible CPU-specific data */
Packit Service a1973e
#define PERFCTR_CPU_VERSION	0x0501	/* 5.1 */
Packit Service a1973e
Packit Service a1973e
#ifdef __KERNEL__
Packit Service a1973e
Packit Service a1973e
#if defined(CONFIG_PERFCTR) || defined(CONFIG_PERFCTR_MODULE)
Packit Service a1973e
Packit Service a1973e
/* Driver init/exit. */
Packit Service a1973e
extern int perfctr_cpu_init(void);
Packit Service a1973e
extern void perfctr_cpu_exit(void);
Packit Service a1973e
Packit Service a1973e
/* CPU type name. */
Packit Service a1973e
extern char *perfctr_cpu_name;
Packit Service a1973e
Packit Service a1973e
/* Hardware reservation. */
Packit Service a1973e
extern const char *perfctr_cpu_reserve(const char *service);
Packit Service a1973e
extern void perfctr_cpu_release(const char *service);
Packit Service a1973e
Packit Service a1973e
/* PRE: state has no running interrupt-mode counters.
Packit Service a1973e
   Check that the new control data is valid.
Packit Service a1973e
   Update the driver's private control data.
Packit Service a1973e
   cpumask must be NULL for global-mode counters and non-NULL
Packit Service a1973e
   for per-thread counters. If cpumask is non-NULL and the control
Packit Service a1973e
   data requires the task to be restricted to a specific set of
Packit Service a1973e
   CPUs, then *cpumask will be updated accordingly.
Packit Service a1973e
   Returns a negative error code if the control data is invalid. */
Packit Service a1973e
extern int perfctr_cpu_update_control(struct perfctr_cpu_state *state, cpumask_t *cpumask);
Packit Service a1973e
Packit Service a1973e
/* Read a-mode counters. Subtract from start and accumulate into sums.
Packit Service a1973e
   Must be called with preemption disabled. */
Packit Service a1973e
extern void perfctr_cpu_suspend(struct perfctr_cpu_state *state);
Packit Service a1973e
Packit Service a1973e
/* Write control registers. Read a-mode counters into start.
Packit Service a1973e
   Must be called with preemption disabled. */
Packit Service a1973e
extern void perfctr_cpu_resume(struct perfctr_cpu_state *state);
Packit Service a1973e
Packit Service a1973e
/* Perform an efficient combined suspend/resume operation.
Packit Service a1973e
   Must be called with preemption disabled. */
Packit Service a1973e
extern void perfctr_cpu_sample(struct perfctr_cpu_state *state);
Packit Service a1973e
Packit Service a1973e
/* The type of a perfctr overflow interrupt handler.
Packit Service a1973e
   It will be called in IRQ context, with preemption disabled. */
Packit Service a1973e
typedef void (*perfctr_ihandler_t)(unsigned long pc);
Packit Service a1973e
Packit Service a1973e
/* Operations related to overflow interrupt handling. */
Packit Service a1973e
#ifdef CONFIG_X86_LOCAL_APIC
Packit Service a1973e
extern void __perfctr_cpu_mask_interrupts(void);
Packit Service a1973e
extern void __perfctr_cpu_unmask_interrupts(void);
Packit Service a1973e
extern void perfctr_cpu_set_ihandler(perfctr_ihandler_t);
Packit Service a1973e
extern void perfctr_cpu_ireload(struct perfctr_cpu_state*);
Packit Service a1973e
extern unsigned int perfctr_cpu_identify_overflow(struct perfctr_cpu_state*);
Packit Service a1973e
static inline int perfctr_cpu_has_pending_interrupt(const struct perfctr_cpu_state *state)
Packit Service a1973e
{
Packit Service a1973e
	return state->pending_interrupt;
Packit Service a1973e
}
Packit Service a1973e
#else
Packit Service a1973e
static inline void perfctr_cpu_set_ihandler(perfctr_ihandler_t x) { }
Packit Service a1973e
static inline int perfctr_cpu_has_pending_interrupt(const struct perfctr_cpu_state *state)
Packit Service a1973e
{
Packit Service a1973e
	return 0;
Packit Service a1973e
}
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
#endif	/* CONFIG_PERFCTR */
Packit Service a1973e
Packit Service a1973e
#if defined(CONFIG_KPERFCTR) && defined(CONFIG_X86_LOCAL_APIC)
Packit Service a1973e
asmlinkage void perfctr_interrupt(struct pt_regs*);
Packit Service a1973e
#include <linux/version.h>
Packit Service a1973e
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)	/* 2.6.27-rc1 */
Packit Service a1973e
#define perfctr_vector_init()	\
Packit Service a1973e
	alloc_intr_gate(LOCAL_PERFCTR_VECTOR, perfctr_interrupt)
Packit Service a1973e
#else
Packit Service a1973e
#define perfctr_vector_init()	\
Packit Service a1973e
	set_intr_gate(LOCAL_PERFCTR_VECTOR, perfctr_interrupt)
Packit Service a1973e
#endif
Packit Service a1973e
#else
Packit Service a1973e
#define perfctr_vector_init()	do{}while(0)
Packit Service a1973e
#endif
Packit Service a1973e
Packit Service a1973e
#endif	/* __KERNEL__ */
Packit Service a1973e
Packit Service a1973e
#endif	/* _ASM_X86_PERFCTR_H */