xref: /openbsd-src/sys/arch/i386/include/pctr.h (revision 2df76cc2a0aee2cb2166e3799b7bb5c3f883f83d)
1*2df76cc2Sguenther /*	$OpenBSD: pctr.h,v 1.17 2014/03/29 18:09:29 guenther Exp $	*/
22552bc39Sdm 
32552bc39Sdm /*
42552bc39Sdm  * Pentium performance counter driver for OpenBSD.
5f420a497Sdm  * Copyright 1996 David Mazieres <dm@lcs.mit.edu>.
6f420a497Sdm  *
7f420a497Sdm  * Modification and redistribution in source and binary forms is
8f420a497Sdm  * permitted provided that due credit is given to the author and the
927ab4cd3Spvalchev  * OpenBSD project by leaving this copyright notice intact.
102552bc39Sdm  */
112552bc39Sdm 
122fa72412Spirofti #ifndef _MACHINE_PCTR_H_
132fa72412Spirofti #define _MACHINE_PCTR_H_
142552bc39Sdm 
1572f91c1dSderaadt #include <sys/ioccom.h>
1672f91c1dSderaadt 
179eecd0bfSderaadt typedef u_int64_t	pctrval;
182552bc39Sdm 
199eecd0bfSderaadt #define PCTR_NUM	4
202552bc39Sdm 
212552bc39Sdm struct pctrst {
229eecd0bfSderaadt 	u_int pctr_fn[PCTR_NUM];	/* Current settings of counters */
23b12f8e8aSdm 	pctrval pctr_tsc;		/* Free-running 64-bit cycle counter */
24b12f8e8aSdm 	pctrval pctr_hwc[PCTR_NUM];	/* Values of the hardware counters */
252552bc39Sdm };
262552bc39Sdm 
272552bc39Sdm /* Bit values in fn fields and PIOCS ioctl's */
28f420a497Sdm #define P5CTR_K		0x40		/* Monitor kernel-level events */
29f420a497Sdm #define P5CTR_U		0x80		/* Monitor user-level events */
30f420a497Sdm #define P5CTR_C		0x100		/* count cycles rather than events */
31f420a497Sdm 
327f8cebadSderaadt #define PCTR_U		0x010000	/* Monitor user-level events */
337f8cebadSderaadt #define PCTR_K		0x020000	/* Monitor kernel-level events */
347f8cebadSderaadt #define PCTR_E		0x040000	/* Edge detect */
357f8cebadSderaadt #define PCTR_EN		0x400000	/* Enable counters (counter 0 only) */
367f8cebadSderaadt #define PCTR_I		0x800000	/* Invert counter mask */
372552bc39Sdm 
38ca3459f6Sdm /* Unit Mask bits */
397f8cebadSderaadt #define PCTR_UM_M	0x0800		/* Modified cache lines */
407f8cebadSderaadt #define PCTR_UM_E	0x0400		/* Exclusive cache lines */
417f8cebadSderaadt #define PCTR_UM_S	0x0200		/* Shared cache lines */
427f8cebadSderaadt #define PCTR_UM_I	0x0100		/* Invalid cache lines */
437f8cebadSderaadt #define PCTR_UM_MESI	(PCTR_UM_M|PCTR_UM_E|PCTR_UM_S|PCTR_UM_I)
447f8cebadSderaadt #define PCTR_UM_A	0x2000		/* Any initiator */
45ca3459f6Sdm 
467f8cebadSderaadt #define PCTR_UM_SHIFT	8		/* Left shift for unit mask */
477f8cebadSderaadt #define PCTR_CM_SHIFT	24		/* Left shift for counter mask */
48b12f8e8aSdm 
499eecd0bfSderaadt /* ioctl to set which counter a device tracks */
502552bc39Sdm #define PCIOCRD _IOR('c', 1, struct pctrst)	/* Read counter value */
51f420a497Sdm #define PCIOCS0 _IOW('c', 8, unsigned int)	/* Set counter 0 function */
52f420a497Sdm #define PCIOCS1 _IOW('c', 9, unsigned int)	/* Set counter 1 function */
539eecd0bfSderaadt #define PCIOCS2 _IOW('c', 10, unsigned int)	/* Set counter 0 function */
549eecd0bfSderaadt #define PCIOCS3 _IOW('c', 11,  unsigned int)	/* Set counter 1 function */
552552bc39Sdm 
562552bc39Sdm #define _PATH_PCTR "/dev/pctr"
572552bc39Sdm 
58f420a497Sdm #define rdtsc()							\
59f420a497Sdm ({								\
60f420a497Sdm 	pctrval v;						\
61*2df76cc2Sguenther 	__asm volatile ("rdtsc" : "=A" (v));			\
62f420a497Sdm 	v;							\
63f420a497Sdm })
64f420a497Sdm 
65f420a497Sdm /* Read the performance counters (Pentium Pro only) */
66f420a497Sdm #define rdpmc(ctr)						\
67f420a497Sdm ({								\
68f420a497Sdm 	pctrval v;						\
69*2df76cc2Sguenther 	__asm volatile ("rdpmc\n"				\
7066b658f2Sdm 	    "\tandl $0xff, %%edx"				\
7166b658f2Sdm 	    : "=A" (v) : "c" (ctr));				\
72f420a497Sdm 	v;							\
73f420a497Sdm })
74f420a497Sdm 
75f420a497Sdm #ifdef _KERNEL
76f420a497Sdm 
77f420a497Sdm #define rdmsr(msr)						\
78f420a497Sdm ({								\
79f420a497Sdm 	pctrval v;						\
80*2df76cc2Sguenther 	__asm volatile ("rdmsr" : "=A" (v) : "c" (msr));	\
81f420a497Sdm 	v;							\
82f420a497Sdm })
83f420a497Sdm 
84f420a497Sdm #define wrmsr(msr, v) \
85*2df76cc2Sguenther 	__asm volatile ("wrmsr" :: "A" ((u_int64_t) (v)), "c" (msr));
86f420a497Sdm 
879eecd0bfSderaadt void	pctrattach(int);
889eecd0bfSderaadt int	pctropen(dev_t, int, int, struct proc *);
899eecd0bfSderaadt int	pctrclose(dev_t, int, int, struct proc *);
909eecd0bfSderaadt int	pctrioctl(dev_t, u_long, caddr_t, int, struct proc *);
919eecd0bfSderaadt 
92f420a497Sdm #endif /* _KERNEL */
932fa72412Spirofti #endif /* ! _MACHINE_PCTR_H_ */
94