op_events.h revision 84862f9f1c18e2906bd17871ed0970751de7eeae
1/**
2 * @file op_events.h
3 * Details of PMC profiling events
4 *
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
7 *
8 * @author John Levon
9 * @author Philippe Elie
10 */
11
12#ifndef OP_EVENTS_H
13#define OP_EVENTS_H
14
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19#include "op_cpu_type.h"
20#include "op_types.h"
21#include "op_list.h"
22
23/** Describe an unit mask type. Events can optionally use a filter called
24 * the unit mask. the mask type can be a bitmask or a discrete value */
25enum unit_mask_type {
26	utm_mandatory,		/**< useless but required by the hardware */
27	utm_exclusive,		/**< only one of the values is allowed */
28	utm_bitmask		/**< bitmask */
29};
30
31/** up to thirty two allowed unit masks */
32#define MAX_UNIT_MASK 32
33
34
35/** Describe an unit mask. */
36struct op_unit_mask {
37	char * name;		/**< name of unit mask type */
38	u32 num;		/**< number of possible unit masks */
39	enum unit_mask_type unit_type_mask;
40	u32 default_mask;	/**< only the gui use it */
41	struct op_described_um {
42		u32 value;
43		char * desc;
44	} um[MAX_UNIT_MASK];
45	struct list_head um_next; /**< next um in list */
46	int used;                 /**< used by events file parser */
47};
48
49
50/** Describe an event. */
51struct op_event {
52	u32 counter_mask;	/**< bitmask of allowed counter  */
53	u32 val;		/**< event number */
54	/** which unit mask if any allowed */
55	struct op_unit_mask * unit;
56	char * name;		/**< the event name */
57	char * desc;      	/**< the event description */
58	int min_count;		/**< minimum counter value allowed */
59	int filter;		/**< architecture specific filter or -1 */
60	char * ext;		/**< extended events */
61	struct list_head event_next;   /**< next event in list */
62};
63
64/** Return the known events list. Idempotent */
65struct list_head * op_events(op_cpu cpu_type);
66
67/** Find a given event, returns NULL on error */
68struct op_event * op_find_event(op_cpu cpu_type, u32 nr, u32 um);
69struct op_event * op_find_event_any(op_cpu cpu_type, u32 nr);
70
71/** Find a given event by name */
72struct op_event * find_event_by_name(char const * name, unsigned um,
73                                     int um_valid);
74
75/**
76 * Find a mapping for a given event ID for architectures requiring additional information
77 * from what is held in the events file.
78 */
79char const * find_mapping_for_event(u32 val, op_cpu cpu_type);
80
81
82/** op_check_events() return code */
83enum op_event_check {
84	OP_OK_EVENT = 0, /**< event is valid and allowed */
85	OP_INVALID_EVENT = 1, /**< event number is invalid */
86	OP_INVALID_UM = 2, /**< unit mask is invalid */
87	OP_INVALID_COUNTER = 4 /**< event is not allowed for the given counter */
88};
89
90/**
91 * sanity check event values
92 * @param ctr counter number
93 * @param event value for counter
94 * @param um unit mask for counter
95 * @param cpu_type processor type
96 *
97 * Check that the counter event and unit mask values are allowed.
98 *
99 * The function returns bitmask of failure cause 0 otherwise
100 *
101 * \sa op_cpu, OP_EVENTS_OK
102 */
103int op_check_events(int ctr, u32 event, u32 um, op_cpu cpu_type);
104
105/**
106 * free memory used by any call to above function. Need to be called only once
107 */
108void op_free_events(void);
109
110struct op_default_event_descr {
111	char * name;
112	unsigned long count;
113	unsigned long um;
114};
115
116/**
117 * op_default_event - return the details of the default event
118 * @param cpu_type  cpu type
119 * @param descr filled event description
120 *
121 * Fills in the event description if applicable
122 */
123void op_default_event(op_cpu cpu_type, struct op_default_event_descr * descr);
124
125#ifdef __cplusplus
126}
127#endif
128
129#endif /* OP_EVENTS_H */
130