/* $Id: ppc.h,v 1.2 2005/04/09 10:25:47 mikpe Exp $ * PPC32-specific code for performance counters library. * * Copyright (C) 2004 Mikael Pettersson */ #ifndef __LIB_PERFCTR_PPC_H #define __LIB_PERFCTR_PPC_H static __inline__ unsigned long get_tbl(void) { unsigned long tbl; asm volatile("mftb %0" : "=r" (tbl)); return tbl; } #define rdtscl(x) do { (x) = get_tbl(); } while(0) #define SPRN_PVR 0x11F #define PVR_VER(pvr) (((pvr) >> 16) & 0xFFFF) #define SPRN_UPMC1 0x3A9 #define SPRN_UPMC2 0x3AA #define SPRN_UPMC3 0x3AD #define SPRN_UPMC4 0x3AE #define SPRN_UPMC5 0x3A1 #define SPRN_UPMC6 0x3A2 #define __stringify_1(x) #x #define __stringify(x) __stringify_1(x) #define mfspr(rn) ({unsigned int rval; \ asm volatile("mfspr %0," __stringify(rn) \ : "=r" (rval)); rval; }) static __inline__ unsigned int read_pmc(unsigned int pmc) { switch( pmc ) { default: /* impossible, but silences gcc warning */ case 0: return mfspr(SPRN_UPMC1); case 1: return mfspr(SPRN_UPMC2); case 2: return mfspr(SPRN_UPMC3); case 3: return mfspr(SPRN_UPMC4); case 4: return mfspr(SPRN_UPMC5); case 5: return mfspr(SPRN_UPMC6); } } #define rdpmcl(pmc,x) do { (x) = read_pmc((pmc)); } while(0) #define vperfctr_has_rdpmc(vperfctr) ((vperfctr)->have_rdpmc) extern void perfctr_info_cpu_init(struct perfctr_info*); #endif /* __LIB_PERFCTR_PPC_H */