make oldconfig will rebuild these...
[linux-2.4.21-pre4.git] / include / asm-ia64 / perfmon.h
1 /*
2  * Copyright (C) 2001-2002 Hewlett-Packard Co
3  *               Stephane Eranian <eranian@hpl.hp.com>
4  */
5
6 #ifndef _ASM_IA64_PERFMON_H
7 #define _ASM_IA64_PERFMON_H
8
9 /*
10  * perfmon comamnds supported on all CPU models
11  */
12 #define PFM_WRITE_PMCS          0x01
13 #define PFM_WRITE_PMDS          0x02
14 #define PFM_READ_PMDS           0x03
15 #define PFM_STOP                0x04
16 #define PFM_START               0x05
17 #define PFM_ENABLE              0x06
18 #define PFM_DISABLE             0x07
19 #define PFM_CREATE_CONTEXT      0x08
20 #define PFM_DESTROY_CONTEXT     0x09
21 #define PFM_RESTART             0x0a
22 #define PFM_PROTECT_CONTEXT     0x0b
23 #define PFM_GET_FEATURES        0x0c
24 #define PFM_DEBUG               0x0d
25 #define PFM_UNPROTECT_CONTEXT   0x0e
26 #define PFM_GET_PMC_RESET_VAL   0x0f
27
28
29 /*
30  * CPU model specific commands (may not be supported on all models)
31  */
32 #define PFM_WRITE_IBRS          0x20
33 #define PFM_WRITE_DBRS          0x21
34
35 /*
36  * context flags
37  */
38 #define PFM_FL_INHERIT_NONE      0x00   /* never inherit a context across fork (default) */
39 #define PFM_FL_INHERIT_ONCE      0x01   /* clone pfm_context only once across fork() */
40 #define PFM_FL_INHERIT_ALL       0x02   /* always clone pfm_context across fork() */
41 #define PFM_FL_NOTIFY_BLOCK      0x04   /* block task on user level notifications */
42 #define PFM_FL_SYSTEM_WIDE       0x08   /* create a system wide context */
43
44 /*
45  * PMC flags
46  */
47 #define PFM_REGFL_OVFL_NOTIFY   0x1     /* send notification on overflow */
48 #define PFM_REGFL_RANDOM        0x2     /* randomize sampling interval */
49
50 /*
51  * PMD/PMC/IBR/DBR return flags (ignored on input)
52  *
53  * Those flags are used on output and must be checked in case EAGAIN is returned
54  * by any of the calls using a pfarg_reg_t or pfarg_dbreg_t structure.
55  */
56 #define PFM_REG_RETFL_NOTAVAIL  (1U<<31) /* set if register is implemented but not available */
57 #define PFM_REG_RETFL_EINVAL    (1U<<30) /* set if register entry is invalid */
58 #define PFM_REG_RETFL_MASK      (PFM_REG_RETFL_NOTAVAIL|PFM_REG_RETFL_EINVAL)
59
60 #define PFM_REG_HAS_ERROR(flag) (((flag) & PFM_REG_RETFL_MASK) != 0)
61
62 /*
63  * Request structure used to define a context
64  */
65 typedef struct {
66         unsigned long ctx_smpl_entries; /* how many entries in sampling buffer */
67         unsigned long ctx_smpl_regs[4]; /* which pmds to record on overflow */
68
69         pid_t         ctx_notify_pid;   /* which process to notify on overflow */
70         int           ctx_flags;        /* noblock/block, inherit flags */
71         void          *ctx_smpl_vaddr;  /* returns address of BTB buffer */
72
73         unsigned long ctx_cpu_mask;     /* on which CPU to enable perfmon (systemwide) */
74
75         unsigned long reserved[8];      /* for future use */
76 } pfarg_context_t;
77
78 /*
79  * Request structure used to write/read a PMC or PMD
80  */
81 typedef struct {
82         unsigned int    reg_num;        /* which register */
83         unsigned int    reg_flags;      /* PMC: notify/don't notify. PMD/PMC: return flags */
84         unsigned long   reg_value;      /* configuration (PMC) or initial value (PMD) */
85
86         unsigned long   reg_long_reset; /* reset after sampling buffer overflow (large) */
87         unsigned long   reg_short_reset;/* reset after counter overflow (small) */
88
89         unsigned long   reg_reset_pmds[4];   /* which other counters to reset on overflow */
90         unsigned long   reg_random_seed;     /* seed value when randomization is used */
91         unsigned long   reg_random_mask;     /* bitmask used to limit random value */
92         unsigned long   reg_last_reset_value;/* last value used to reset the PMD (PFM_READ_PMDS) */
93
94         unsigned long   reserved[13];   /* for future use */
95 } pfarg_reg_t;
96
97 typedef struct {
98         unsigned int    dbreg_num;      /* which register */
99         unsigned int    dbreg_flags;    /* dbregs return flags */
100         unsigned long   dbreg_value;    /* configuration (PMC) or initial value (PMD) */
101         unsigned long   reserved[6];
102 } pfarg_dbreg_t;
103
104 typedef struct {                        
105         unsigned int    ft_version;     /* perfmon: major [16-31], minor [0-15] */
106         unsigned int    ft_smpl_version;/* sampling format: major [16-31], minor [0-15] */
107         unsigned long   reserved[4];    /* for future use */
108 } pfarg_features_t;
109
110 /*
111  * This header is at the beginning of the sampling buffer returned to the user.
112  * It is exported as Read-Only at this point. It is directly followed by the
113  * first record.
114  */
115 typedef struct {
116         unsigned int    hdr_version;            /* contains perfmon version (smpl format diffs) */
117         unsigned int    reserved;
118         unsigned long   hdr_entry_size;         /* size of one entry in bytes */
119         unsigned long   hdr_count;              /* how many valid entries */
120         unsigned long   hdr_pmds[4];            /* which pmds are recorded */
121 } perfmon_smpl_hdr_t;
122
123 /*
124  * Define the version numbers for both perfmon as a whole and the sampling buffer format.
125  */
126 #define PFM_VERSION_MAJ         1U
127 #define PFM_VERSION_MIN         2U
128 #define PFM_VERSION             (((PFM_VERSION_MAJ&0xffff)<<16)|(PFM_VERSION_MIN & 0xffff))
129
130 #define PFM_SMPL_VERSION_MAJ    1U
131 #define PFM_SMPL_VERSION_MIN    0U
132 #define PFM_SMPL_VERSION        (((PFM_SMPL_VERSION_MAJ&0xffff)<<16)|(PFM_SMPL_VERSION_MIN & 0xffff))
133
134
135 #define PFM_VERSION_MAJOR(x)    (((x)>>16) & 0xffff)
136 #define PFM_VERSION_MINOR(x)    ((x) & 0xffff)
137
138 /*
139  * Entry header in the sampling buffer.
140  * The header is directly followed with the PMDS saved in increasing index 
141  * order: PMD4, PMD5, .... How many PMDs are present is determined by the 
142  * user program during context creation.
143  *
144  * XXX: in this version of the entry, only up to 64 registers can be recorded
145  * This should be enough for quite some time. Always check sampling format
146  * before parsing entries!
147  *
148  * In the case where multiple counters overflow at the same time, the
149  * last_reset_value member indicates the initial value of the PMD with
150  * the smallest index.  For instance, if PMD2 and PMD5 have overflowed,
151  * the last_reset_value member contains the initial value of PMD2.
152  */
153 typedef struct {
154         int             pid;             /* identification of process */
155         int             cpu;             /* which cpu was used */
156         unsigned long   last_reset_value;/* initial value of overflowed counter */
157         unsigned long   stamp;           /* timestamp (unique per CPU) */
158         unsigned long   ip;              /* where did the overflow interrupt happened */
159         unsigned long   regs;            /* bitmask of which registers overflowed */
160         unsigned long   period;          /* sampling period used by overflowed counter (smallest pmd index) */
161 } perfmon_smpl_entry_t;
162
163 extern int perfmonctl(pid_t pid, int cmd, void *arg, int narg);
164
165 #ifdef __KERNEL__
166
167 typedef struct {
168         void (*handler)(int irq, void *arg, struct pt_regs *regs);
169 } pfm_intr_handler_desc_t;
170
171 extern void pfm_save_regs (struct task_struct *);
172 extern void pfm_load_regs (struct task_struct *);
173
174 extern int  pfm_inherit (struct task_struct *, struct pt_regs *);
175 extern void pfm_context_exit (struct task_struct *);
176 extern void pfm_flush_regs (struct task_struct *);
177 extern void pfm_cleanup_notifiers (struct task_struct *);
178 extern void pfm_cleanup_owners (struct task_struct *);
179 extern int  pfm_use_debug_registers(struct task_struct *);
180 extern int  pfm_release_debug_registers(struct task_struct *);
181 extern int  pfm_cleanup_smpl_buf(struct task_struct *);
182 extern void pfm_syst_wide_update_task(struct task_struct *, int);
183 extern void pfm_init_percpu(void);
184
185 /* 
186  * hooks to allow VTune/Prospect to cooperate with perfmon.
187  * (reserved for system wide monitoring modules only)
188  */
189 extern int pfm_install_alternate_syswide_subsystem(pfm_intr_handler_desc_t *h);
190 extern int pfm_remove_alternate_syswide_subsystem(pfm_intr_handler_desc_t *h);
191
192 #endif /* __KERNEL__ */
193
194 #endif /* _ASM_IA64_PERFMON_H */