af8a393211a3c24bd0436702222e569844044d47
[linux-flexiantxendom0-3.2.10.git] / include / asm-ia64 / perfmon.h
1 /*
2  * Copyright (C) 2001-2003 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 #define PFM_FL_EXCL_IDLE         0x20   /* exclude idle task from system wide session */
44
45 /*
46  * PMC flags
47  */
48 #define PFM_REGFL_OVFL_NOTIFY   0x1     /* send notification on overflow */
49 #define PFM_REGFL_RANDOM        0x2     /* randomize sampling periods    */
50
51 /*
52  * PMD/PMC/IBR/DBR return flags (ignored on input)
53  *
54  * Those flags are used on output and must be checked in case EAGAIN is returned
55  * by any of the calls using a pfarg_reg_t or pfarg_dbreg_t structure.
56  */
57 #define PFM_REG_RETFL_NOTAVAIL  (1U<<31) /* set if register is implemented but not available */
58 #define PFM_REG_RETFL_EINVAL    (1U<<30) /* set if register entry is invalid */
59 #define PFM_REG_RETFL_MASK      (PFM_REG_RETFL_NOTAVAIL|PFM_REG_RETFL_EINVAL)
60
61 #define PFM_REG_HAS_ERROR(flag) (((flag) & PFM_REG_RETFL_MASK) != 0)
62
63 /*
64  * Request structure used to define a context
65  */
66 typedef struct {
67         unsigned long ctx_smpl_entries; /* how many entries in sampling buffer */
68         unsigned long ctx_smpl_regs[4]; /* which pmds to record on overflow */
69
70         pid_t         ctx_notify_pid;   /* which process to notify on overflow */
71         int           ctx_flags;        /* noblock/block, inherit flags */
72         void          *ctx_smpl_vaddr;  /* returns address of BTB buffer */
73
74         unsigned long ctx_cpu_mask;     /* on which CPU to enable perfmon (systemwide) */
75
76         unsigned long reserved[8];      /* for future use */
77 } pfarg_context_t;
78
79 /*
80  * Request structure used to write/read a PMC or PMD
81  */
82 typedef struct {
83         unsigned int    reg_num;        /* which register */
84         unsigned int    reg_flags;      /* PMC: notify/don't notify. PMD/PMC: return flags */
85         unsigned long   reg_value;      /* configuration (PMC) or initial value (PMD) */
86
87         unsigned long   reg_long_reset; /* reset after sampling buffer overflow (large) */
88         unsigned long   reg_short_reset;/* reset after counter overflow (small) */
89
90         unsigned long   reg_reset_pmds[4];   /* which other counters to reset on overflow */
91         unsigned long   reg_random_seed;     /* seed value when randomization is used */
92         unsigned long   reg_random_mask;     /* bitmask used to limit random value */
93         unsigned long   reg_last_reset_value;/* last value used to reset the PMD (PFM_READ_PMDS) */
94
95         unsigned long   reserved[13];   /* for future use */
96 } pfarg_reg_t;
97
98 typedef struct {
99         unsigned int    dbreg_num;      /* which register */
100         unsigned int    dbreg_flags;    /* dbregs return flags */
101         unsigned long   dbreg_value;    /* configuration (PMC) or initial value (PMD) */
102         unsigned long   reserved[6];
103 } pfarg_dbreg_t;
104
105 typedef struct {                        
106         unsigned int    ft_version;     /* perfmon: major [16-31], minor [0-15] */
107         unsigned int    ft_smpl_version;/* sampling format: major [16-31], minor [0-15] */
108         unsigned long   reserved[4];    /* for future use */
109 } pfarg_features_t;
110
111 /*
112  * This header is at the beginning of the sampling buffer returned to the user.
113  * It is exported as Read-Only at this point. It is directly followed by the
114  * first record.
115  */
116 typedef struct {
117         unsigned int    hdr_version;            /* contains perfmon version (smpl format diffs) */
118         unsigned int    reserved;
119         unsigned long   hdr_entry_size;         /* size of one entry in bytes */
120         unsigned long   hdr_count;              /* how many valid entries */
121         unsigned long   hdr_pmds[4];            /* which pmds are recorded */
122 } perfmon_smpl_hdr_t;
123
124 /*
125  * Define the version numbers for both perfmon as a whole and the sampling buffer format.
126  */
127 #define PFM_VERSION_MAJ         1U
128 #define PFM_VERSION_MIN         3U
129 #define PFM_VERSION             (((PFM_VERSION_MAJ&0xffff)<<16)|(PFM_VERSION_MIN & 0xffff))
130
131 #define PFM_SMPL_VERSION_MAJ    1U
132 #define PFM_SMPL_VERSION_MIN    0U
133 #define PFM_SMPL_VERSION        (((PFM_SMPL_VERSION_MAJ&0xffff)<<16)|(PFM_SMPL_VERSION_MIN & 0xffff))
134
135
136 #define PFM_VERSION_MAJOR(x)    (((x)>>16) & 0xffff)
137 #define PFM_VERSION_MINOR(x)    ((x) & 0xffff)
138
139 /*
140  * Entry header in the sampling buffer.  The header is directly followed
141  * with the PMDs saved in increasing index order: PMD4, PMD5, .... How
142  * many PMDs are present is determined by the user program during
143  * context creation.
144  *
145  * XXX: in this version of the entry, only up to 64 registers can be
146  * recorded. This should be enough for quite some time. Always check
147  * sampling format before parsing entries!
148  *
149  * In the case where multiple counters overflow at the same time, the
150  * last_reset_value member indicates the initial value of the PMD with
151  * the smallest index.  For instance, if PMD2 and PMD5 have overflowed,
152  * the last_reset_value member contains the initial value of PMD2.
153  */
154 typedef struct {
155         int             pid;                    /* identification of process */
156         int             cpu;                    /* which cpu was used */
157         unsigned long   last_reset_value;       /* initial value of counter that overflowed */
158         unsigned long   stamp;                  /* timestamp */
159         unsigned long   ip;                     /* where did the overflow interrupt happened */
160         unsigned long   regs;                   /* bitmask of which registers overflowed */
161         unsigned long   reserved;               /* unused */
162 } perfmon_smpl_entry_t;
163
164 extern long perfmonctl(pid_t pid, int cmd, void *arg, int narg);
165
166 #ifdef __KERNEL__
167
168 typedef struct {
169         void (*handler)(int irq, void *arg, struct pt_regs *regs);
170 } pfm_intr_handler_desc_t;
171
172 extern void pfm_save_regs (struct task_struct *);
173 extern void pfm_load_regs (struct task_struct *);
174
175 extern int  pfm_inherit (struct task_struct *, struct pt_regs *);
176 extern void pfm_context_exit (struct task_struct *);
177 extern void pfm_flush_regs (struct task_struct *);
178 extern void pfm_cleanup_notifiers (struct task_struct *);
179 extern void pfm_cleanup_owners (struct task_struct *);
180 extern int  pfm_use_debug_registers(struct task_struct *);
181 extern int  pfm_release_debug_registers(struct task_struct *);
182 extern int  pfm_cleanup_smpl_buf(struct task_struct *);
183 extern void pfm_syst_wide_update_task(struct task_struct *, unsigned long info, int is_ctxswin);
184 extern void pfm_ovfl_block_reset(void);
185 extern void pfm_init_percpu(void);
186
187 /* 
188  * hooks to allow VTune/Prospect to cooperate with perfmon.
189  * (reserved for system wide monitoring modules only)
190  */
191 extern int pfm_install_alternate_syswide_subsystem(pfm_intr_handler_desc_t *h);
192 extern int pfm_remove_alternate_syswide_subsystem(pfm_intr_handler_desc_t *h);
193
194 /*
195  * describe the content of the local_cpu_date->pfm_syst_info field
196  */
197 #define PFM_CPUINFO_SYST_WIDE   0x1     /* if set a system wide session exist */
198 #define PFM_CPUINFO_DCR_PP      0x2     /* if set the system wide session has started */
199 #define PFM_CPUINFO_EXCL_IDLE   0x4     /* the system wide session excludes the idle task */
200
201
202 #endif /* __KERNEL__ */
203
204 #endif /* _ASM_IA64_PERFMON_H */