diff options
Diffstat (limited to 'arch/sparc/include/asm/perfctr.h')
| -rw-r--r-- | arch/sparc/include/asm/perfctr.h | 23 | 
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/sparc/include/asm/perfctr.h b/arch/sparc/include/asm/perfctr.h index 8d8720a8770..3332d2cba6c 100644 --- a/arch/sparc/include/asm/perfctr.h +++ b/arch/sparc/include/asm/perfctr.h @@ -168,6 +168,29 @@ struct vcounter_struct {    unsigned long long vcnt1;  }; +#else /* !(__KERNEL__) */ + +#ifndef CONFIG_SPARC32 + +/* Performance counter register access. */ +#define read_pcr(__p)  __asm__ __volatile__("rd	%%pcr, %0" : "=r" (__p)) +#define write_pcr(__p) __asm__ __volatile__("wr	%0, 0x0, %%pcr" : : "r" (__p)) +#define read_pic(__p)  __asm__ __volatile__("rd %%pic, %0" : "=r" (__p)) + +/* Blackbird errata workaround.  See commentary in + * arch/sparc64/kernel/smp.c:smp_percpu_timer_interrupt() + * for more information. + */ +#define write_pic(__p)  					\ +	__asm__ __volatile__("ba,pt	%%xcc, 99f\n\t"		\ +			     " nop\n\t"				\ +			     ".align	64\n"			\ +			  "99:wr	%0, 0x0, %%pic\n\t"	\ +			     "rd	%%pic, %%g0" : : "r" (__p)) +#define reset_pic()	write_pic(0) + +#endif /* !CONFIG_SPARC32 */ +  #endif /* !(__KERNEL__) */  #endif /* !(PERF_COUNTER_API) */  |