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