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 16 extern "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 */ 25 enum 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. */ 36 struct 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. */ 51 struct 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 */ 65 struct list_head * op_events(op_cpu cpu_type); 66 67 /** Find a given event, returns NULL on error */ 68 struct op_event * op_find_event(op_cpu cpu_type, u32 nr, u32 um); 69 struct op_event * op_find_event_any(op_cpu cpu_type, u32 nr); 70 71 /** Find a given event by name */ 72 struct 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 */ 79 char const * find_mapping_for_event(u32 val, op_cpu cpu_type); 80 81 82 /** op_check_events() return code */ 83 enum 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 */ 103 int 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 */ 108 void op_free_events(void); 109 110 struct 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 */ 123 void 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