The Android Open Source Project | 10e23ee | 2009-03-03 19:30:30 -0800 | [diff] [blame] | 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 */ |
Ben Cheng | 5a4eb4e | 2009-09-14 16:00:41 -0700 | [diff] [blame] | 59 | int filter; /**< architecture specific filter or -1 */ |
| 60 | char * ext; /**< extended events */ |
The Android Open Source Project | 10e23ee | 2009-03-03 19:30:30 -0800 | [diff] [blame] | 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 */ |
Ben Cheng | 5a4eb4e | 2009-09-14 16:00:41 -0700 | [diff] [blame] | 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); |
The Android Open Source Project | 10e23ee | 2009-03-03 19:30:30 -0800 | [diff] [blame] | 70 | |
| 71 | /** Find a given event by name */ |
Ben Cheng | 5a4eb4e | 2009-09-14 16:00:41 -0700 | [diff] [blame] | 72 | struct op_event * find_event_by_name(char const * name, unsigned um, |
| 73 | int um_valid); |
The Android Open Source Project | 10e23ee | 2009-03-03 19:30:30 -0800 | [diff] [blame] | 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 */ |