/** * @file op_events.h * Details of PMC profiling events * * @remark Copyright 2002 OProfile authors * @remark Read the file COPYING * * @author John Levon * @author Philippe Elie */ #ifndef OP_EVENTS_H #define OP_EVENTS_H #ifdef __cplusplus extern "C" { #endif #include "op_cpu_type.h" #include "op_types.h" #include "op_list.h" /** Describe an unit mask type. Events can optionally use a filter called * the unit mask. the mask type can be a bitmask or a discrete value */ enum unit_mask_type { utm_mandatory, /**< useless but required by the hardware */ utm_exclusive, /**< only one of the values is allowed */ utm_bitmask /**< bitmask */ }; /** up to thirty two allowed unit masks */ #define MAX_UNIT_MASK 32 /** Describe an unit mask. */ struct op_unit_mask { char * name; /**< name of unit mask type */ u32 num; /**< number of possible unit masks */ enum unit_mask_type unit_type_mask; u32 default_mask; /**< only the gui use it */ struct op_described_um { u32 value; char * desc; } um[MAX_UNIT_MASK]; struct list_head um_next; /**< next um in list */ int used; /**< used by events file parser */ }; /** Describe an event. */ struct op_event { u32 counter_mask; /**< bitmask of allowed counter */ u32 val; /**< event number */ /** which unit mask if any allowed */ struct op_unit_mask * unit; char * name; /**< the event name */ char * desc; /**< the event description */ int min_count; /**< minimum counter value allowed */ int filter; /**< architecture specific filter or -1 */ char * ext; /**< extended events */ struct list_head event_next; /**< next event in list */ }; /** Return the known events list. Idempotent */ struct list_head * op_events(op_cpu cpu_type); /** Find a given event, returns NULL on error */ struct op_event * op_find_event(op_cpu cpu_type, u32 nr, u32 um); struct op_event * op_find_event_any(op_cpu cpu_type, u32 nr); /** Find a given event by name */ struct op_event * find_event_by_name(char const * name, unsigned um, int um_valid); /** * Find a mapping for a given event ID for architectures requiring additional information * from what is held in the events file. */ char const * find_mapping_for_event(u32 val, op_cpu cpu_type); /** op_check_events() return code */ enum op_event_check { OP_OK_EVENT = 0, /**< event is valid and allowed */ OP_INVALID_EVENT = 1, /**< event number is invalid */ OP_INVALID_UM = 2, /**< unit mask is invalid */ OP_INVALID_COUNTER = 4 /**< event is not allowed for the given counter */ }; /** * sanity check event values * @param ctr counter number * @param event value for counter * @param um unit mask for counter * @param cpu_type processor type * * Check that the counter event and unit mask values are allowed. * * The function returns bitmask of failure cause 0 otherwise * * \sa op_cpu, OP_EVENTS_OK */ int op_check_events(int ctr, u32 event, u32 um, op_cpu cpu_type); /** * free memory used by any call to above function. Need to be called only once */ void op_free_events(void); struct op_default_event_descr { char * name; unsigned long count; unsigned long um; }; /** * op_default_event - return the details of the default event * @param cpu_type cpu type * @param descr filled event description * * Fills in the event description if applicable */ void op_default_event(op_cpu cpu_type, struct op_default_event_descr * descr); #ifdef __cplusplus } #endif #endif /* OP_EVENTS_H */