1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef __PERF_PARSE_EVENTS_H 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __PERF_PARSE_EVENTS_H 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Parse symbolic events/counts passed in as options: 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/list.h> 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdbool.h> 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "types.h" 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/perf_event.h> 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "types.h" 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct list_head; 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_evsel; 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct perf_evlist; 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct option; 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct tracepoint_path { 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *system; 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *name; 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct tracepoint_path *next; 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern struct tracepoint_path *tracepoint_id_to_path(u64 config); 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern struct tracepoint_path *tracepoint_name_to_path(const char *name); 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern bool have_tracepoints(struct list_head *evlist); 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengconst char *event_type(int type); 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int parse_events_option(const struct option *opt, const char *str, 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int unset); 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int parse_events(struct perf_evlist *evlist, const char *str); 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int parse_events_terms(struct list_head *terms, const char *str); 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int parse_filter(const struct option *opt, const char *str, int unset); 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define EVENTS_HELP_MAX (128*1024) 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum { 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng PARSE_EVENTS__TERM_TYPE_NUM, 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng PARSE_EVENTS__TERM_TYPE_STR, 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengenum { 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng PARSE_EVENTS__TERM_TYPE_USER, 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng PARSE_EVENTS__TERM_TYPE_CONFIG, 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng PARSE_EVENTS__TERM_TYPE_CONFIG1, 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng PARSE_EVENTS__TERM_TYPE_CONFIG2, 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng PARSE_EVENTS__TERM_TYPE_NAME, 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng PARSE_EVENTS__TERM_TYPE_SAMPLE_PERIOD, 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng PARSE_EVENTS__TERM_TYPE_BRANCH_SAMPLE_TYPE, 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct parse_events_term { 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *config; 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng union { 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *str; 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 num; 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } val; 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int type_val; 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int type_term; 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct list_head list; 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct parse_events_evlist { 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct list_head list; 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int idx; 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int nr_groups; 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct parse_events_terms { 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct list_head *terms; 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events__is_hardcoded_term(struct parse_events_term *term); 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_term__num(struct parse_events_term **_term, 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int type_term, char *config, u64 num); 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_term__str(struct parse_events_term **_term, 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int type_term, char *config, char *str); 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_term__sym_hw(struct parse_events_term **term, 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *config, unsigned idx); 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_term__clone(struct parse_events_term **new, 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct parse_events_term *term); 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid parse_events__free_terms(struct list_head *terms); 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events__modifier_event(struct list_head *list, char *str, bool add); 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events__modifier_group(struct list_head *list, char *event_mod); 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_name(struct list_head *list, char *name); 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_add_tracepoint(struct list_head *list, int *idx, 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *sys, char *event); 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_add_numeric(struct list_head *list, int *idx, 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u32 type, u64 config, 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct list_head *head_config); 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_add_cache(struct list_head *list, int *idx, 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *type, char *op_result1, char *op_result2); 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_add_breakpoint(struct list_head *list, int *idx, 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng void *ptr, char *type); 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint parse_events_add_pmu(struct list_head *list, int *idx, 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *pmu , struct list_head *head_config); 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid parse_events__set_leader(char *name, struct list_head *list); 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid parse_events_update_lists(struct list_head *list_event, 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct list_head *list_all); 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid parse_events_error(void *data, void *scanner, char const *msg); 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid print_events(const char *event_glob, bool name_only); 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid print_events_type(u8 type); 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid print_tracepoint_events(const char *subsys_glob, const char *event_glob, 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool name_only); 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint print_hwcache_events(const char *event_glob, bool name_only); 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int is_valid_tracepoint(const char *event_string); 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengextern int valid_debugfs_mount(const char *debugfs); 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif /* __PERF_PARSE_EVENTS_H */ 114