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

Packit 577717
/* Maynard
Packit 577717
 * PPC64-specific code for performance counters library.
Packit 577717
 *
Packit 577717
 */
Packit 577717
#ifndef __LIB_PERFCTR_PPC64_H
Packit 577717
#define __LIB_PERFCTR_PPC64_H
Packit 577717
Packit 577717
static __inline__ unsigned long get_tb(void)
Packit 577717
{
Packit 577717
	unsigned long tb;
Packit 577717
	asm volatile("mftb %0" : "=r" (tb));
Packit 577717
	return tb;
Packit 577717
}
Packit 577717
Packit 577717
#define rdtscl(x)	do { (x) = (unsigned int) get_tb(); } while(0)
Packit 577717
Packit 577717
#define SPRN_UPMC1	0x303
Packit 577717
#define SPRN_UPMC2	0x304
Packit 577717
#define SPRN_UPMC3	0x305
Packit 577717
#define SPRN_UPMC4	0x306
Packit 577717
#define SPRN_UPMC5	0x307
Packit 577717
#define SPRN_UPMC6	0x308
Packit 577717
#define SPRN_UPMC7	0x309
Packit 577717
#define SPRN_UPMC8	0x30a
Packit 577717
Packit 577717
#define MMCRA_SIHV	0x10000000UL /* state of MSR HV when SIAR set */
Packit 577717
#define MMCRA_SIPR	0x08000000UL /* state of MSR PR when SIAR set */
Packit 577717
#define MMCRA_SAMPLE_ENABLE 0x00000001UL /* enable sampling */
Packit 577717
Packit 577717
#define MMCR0_FC	0x80000000UL /* freeze counters. set to 1 on a perfmon exception */
Packit 577717
#define MMCR0_FCS	0x40000000UL /* freeze in supervisor state */
Packit 577717
#define MMCR0_KERNEL_DISABLE MMCR0_FCS
Packit 577717
#define MMCR0_FCP	0x20000000UL /* freeze in problem state */
Packit 577717
#define MMCR0_PROBLEM_DISABLE MMCR0_FCP
Packit 577717
#define MMCR0_FCM1	0x10000000UL /* freeze counters while MSR mark = 1 */
Packit 577717
#define MMCR0_FCM0	0x08000000UL /* freeze counters while MSR mark = 0 */
Packit 577717
#define MMCR0_PMXE	0x04000000UL /* performance monitor exception enable */
Packit 577717
#define MMCR0_FCECE	0x02000000UL /* freeze counters on enabled condition or event */
Packit 577717
/* time base exception enable */
Packit 577717
#define MMCR0_TBEE	0x00400000UL /* time base exception enable */
Packit 577717
#define MMCR0_PMC1CE	0x00008000UL /* PMC1 count enable*/
Packit 577717
#define MMCR0_PMCjCE	0x00004000UL /* PMCj count enable*/
Packit 577717
#define MMCR0_TRIGGER	0x00002000UL /* TRIGGER enable */
Packit 577717
#define MMCR0_PMAO	0x00000080UL /* performance monitor alert has occurred, set to 0 after handling exception */
Packit 577717
#define MMCR0_SHRFC	0x00000040UL /* SHRre freeze conditions between threads */
Packit 577717
#define MMCR0_FCTI	0x00000008UL /* freeze counters in tags inactive mode */
Packit 577717
#define MMCR0_FCTA	0x00000004UL /* freeze counters in tags active mode */
Packit 577717
#define MMCR0_FCWAIT	0x00000002UL /* freeze counter in WAIT state */
Packit 577717
#define MMCR0_FCHV	0x00000001UL /* freeze conditions in hypervisor mode */
Packit 577717
Packit 577717
#define mfspr(rn)	({unsigned int rval; \
Packit 577717
			asm volatile("mfspr %0,%1" : "=r"(rval) : "i"(rn)); \
Packit 577717
			rval; })
Packit 577717
Packit 577717
static __inline__ unsigned int read_pmc(unsigned int pmc)
Packit 577717
{
Packit 577717
    switch (pmc) {
Packit 577717
      default: /* impossible, but silences gcc warning */
Packit 577717
      case 0:
Packit 577717
	return mfspr(SPRN_UPMC1);
Packit 577717
      case 1:
Packit 577717
	return mfspr(SPRN_UPMC2);
Packit 577717
      case 2:
Packit 577717
	return mfspr(SPRN_UPMC3);
Packit 577717
      case 3:
Packit 577717
	return mfspr(SPRN_UPMC4);
Packit 577717
      case 4:
Packit 577717
	return mfspr(SPRN_UPMC5);
Packit 577717
      case 5:
Packit 577717
	return mfspr(SPRN_UPMC6);
Packit 577717
      case 6:
Packit 577717
      	return mfspr(SPRN_UPMC7);
Packit 577717
      case 7:
Packit 577717
      	return mfspr(SPRN_UPMC8);
Packit 577717
    }
Packit 577717
}
Packit 577717
#define rdpmcl(pmc,x)	do { (x) = read_pmc((pmc)); } while(0)
Packit 577717
Packit 577717
#define vperfctr_has_rdpmc(vperfctr)	((vperfctr)->have_rdpmc)
Packit 577717
Packit 577717
extern void perfctr_info_cpu_init(struct perfctr_info*);
Packit 577717
Packit 577717
#endif /* __LIB_PERFCTR_PPC64_H */