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