linux/tools/perf/include/perf/perf_dlfilter.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * perf_dlfilter.h: API for perf --dlfilter shared object
   4 * Copyright (c) 2021, Intel Corporation.
   5 */
   6#ifndef _LINUX_PERF_DLFILTER_H
   7#define _LINUX_PERF_DLFILTER_H
   8
   9#include <linux/perf_event.h>
  10#include <linux/types.h>
  11
  12/* Definitions for perf_dlfilter_sample flags */
  13enum {
  14        PERF_DLFILTER_FLAG_BRANCH       = 1ULL << 0,
  15        PERF_DLFILTER_FLAG_CALL         = 1ULL << 1,
  16        PERF_DLFILTER_FLAG_RETURN       = 1ULL << 2,
  17        PERF_DLFILTER_FLAG_CONDITIONAL  = 1ULL << 3,
  18        PERF_DLFILTER_FLAG_SYSCALLRET   = 1ULL << 4,
  19        PERF_DLFILTER_FLAG_ASYNC        = 1ULL << 5,
  20        PERF_DLFILTER_FLAG_INTERRUPT    = 1ULL << 6,
  21        PERF_DLFILTER_FLAG_TX_ABORT     = 1ULL << 7,
  22        PERF_DLFILTER_FLAG_TRACE_BEGIN  = 1ULL << 8,
  23        PERF_DLFILTER_FLAG_TRACE_END    = 1ULL << 9,
  24        PERF_DLFILTER_FLAG_IN_TX        = 1ULL << 10,
  25        PERF_DLFILTER_FLAG_VMENTRY      = 1ULL << 11,
  26        PERF_DLFILTER_FLAG_VMEXIT       = 1ULL << 12,
  27};
  28
  29/*
  30 * perf sample event information (as per perf script and <linux/perf_event.h>)
  31 */
  32struct perf_dlfilter_sample {
  33        __u32 size; /* Size of this structure (for compatibility checking) */
  34        __u16 ins_lat;          /* Refer PERF_SAMPLE_WEIGHT_TYPE in <linux/perf_event.h> */
  35        __u16 p_stage_cyc;      /* Refer PERF_SAMPLE_WEIGHT_TYPE in <linux/perf_event.h> */
  36        __u64 ip;
  37        __s32 pid;
  38        __s32 tid;
  39        __u64 time;
  40        __u64 addr;
  41        __u64 id;
  42        __u64 stream_id;
  43        __u64 period;
  44        __u64 weight;           /* Refer PERF_SAMPLE_WEIGHT_TYPE in <linux/perf_event.h> */
  45        __u64 transaction;      /* Refer PERF_SAMPLE_TRANSACTION in <linux/perf_event.h> */
  46        __u64 insn_cnt; /* For instructions-per-cycle (IPC) */
  47        __u64 cyc_cnt;          /* For instructions-per-cycle (IPC) */
  48        __s32 cpu;
  49        __u32 flags;            /* Refer PERF_DLFILTER_FLAG_* above */
  50        __u64 data_src;         /* Refer PERF_SAMPLE_DATA_SRC in <linux/perf_event.h> */
  51        __u64 phys_addr;        /* Refer PERF_SAMPLE_PHYS_ADDR in <linux/perf_event.h> */
  52        __u64 data_page_size;   /* Refer PERF_SAMPLE_DATA_PAGE_SIZE in <linux/perf_event.h> */
  53        __u64 code_page_size;   /* Refer PERF_SAMPLE_CODE_PAGE_SIZE in <linux/perf_event.h> */
  54        __u64 cgroup;           /* Refer PERF_SAMPLE_CGROUP in <linux/perf_event.h> */
  55        __u8  cpumode;          /* Refer CPUMODE_MASK etc in <linux/perf_event.h> */
  56        __u8  addr_correlates_sym; /* True => resolve_addr() can be called */
  57        __u16 misc;             /* Refer perf_event_header in <linux/perf_event.h> */
  58        __u32 raw_size;         /* Refer PERF_SAMPLE_RAW in <linux/perf_event.h> */
  59        const void *raw_data;   /* Refer PERF_SAMPLE_RAW in <linux/perf_event.h> */
  60        __u64 brstack_nr;       /* Number of brstack entries */
  61        const struct perf_branch_entry *brstack; /* Refer <linux/perf_event.h> */
  62        __u64 raw_callchain_nr; /* Number of raw_callchain entries */
  63        const __u64 *raw_callchain; /* Refer <linux/perf_event.h> */
  64        const char *event;
  65};
  66
  67/*
  68 * Address location (as per perf script)
  69 */
  70struct perf_dlfilter_al {
  71        __u32 size; /* Size of this structure (for compatibility checking) */
  72        __u32 symoff;
  73        const char *sym;
  74        __u64 addr; /* Mapped address (from dso) */
  75        __u64 sym_start;
  76        __u64 sym_end;
  77        const char *dso;
  78        __u8  sym_binding; /* STB_LOCAL, STB_GLOBAL or STB_WEAK, refer <elf.h> */
  79        __u8  is_64_bit; /* Only valid if dso is not NULL */
  80        __u8  is_kernel_ip; /* True if in kernel space */
  81        __u32 buildid_size;
  82        __u8 *buildid;
  83        /* Below members are only populated by resolve_ip() */
  84        __u8 filtered; /* True if this sample event will be filtered out */
  85        const char *comm;
  86};
  87
  88struct perf_dlfilter_fns {
  89        /* Return information about ip */
  90        const struct perf_dlfilter_al *(*resolve_ip)(void *ctx);
  91        /* Return information about addr (if addr_correlates_sym) */
  92        const struct perf_dlfilter_al *(*resolve_addr)(void *ctx);
  93        /* Return arguments from --dlarg option */
  94        char **(*args)(void *ctx, int *dlargc);
  95        /*
  96         * Return information about address (al->size must be set before
  97         * calling). Returns 0 on success, -1 otherwise.
  98         */
  99        __s32 (*resolve_address)(void *ctx, __u64 address, struct perf_dlfilter_al *al);
 100        /* Return instruction bytes and length */
 101        const __u8 *(*insn)(void *ctx, __u32 *length);
 102        /* Return source file name and line number */
 103        const char *(*srcline)(void *ctx, __u32 *line_number);
 104        /* Return perf_event_attr, refer <linux/perf_event.h> */
 105        struct perf_event_attr *(*attr)(void *ctx);
 106        /* Read object code, return numbers of bytes read */
 107        __s32 (*object_code)(void *ctx, __u64 ip, void *buf, __u32 len);
 108        /* Reserved */
 109        void *(*reserved[120])(void *);
 110};
 111
 112/*
 113 * If implemented, 'start' will be called at the beginning,
 114 * before any calls to 'filter_event'. Return 0 to indicate success,
 115 * or return a negative error code. '*data' can be assigned for use
 116 * by other functions. 'ctx' is needed for calls to perf_dlfilter_fns,
 117 * but most perf_dlfilter_fns are not valid when called from 'start'.
 118 */
 119int start(void **data, void *ctx);
 120
 121/*
 122 * If implemented, 'stop' will be called at the end,
 123 * after any calls to 'filter_event'. Return 0 to indicate success, or
 124 * return a negative error code. 'data' is set by start(). 'ctx' is
 125 * needed for calls to perf_dlfilter_fns, but most perf_dlfilter_fns
 126 * are not valid when called from 'stop'.
 127 */
 128int stop(void *data, void *ctx);
 129
 130/*
 131 * If implemented, 'filter_event' will be called for each sample
 132 * event. Return 0 to keep the sample event, 1 to filter it out, or
 133 * return a negative error code. 'data' is set by start(). 'ctx' is
 134 * needed for calls to perf_dlfilter_fns.
 135 */
 136int filter_event(void *data, const struct perf_dlfilter_sample *sample, void *ctx);
 137
 138/*
 139 * The same as 'filter_event' except it is called before internal
 140 * filtering.
 141 */
 142int filter_event_early(void *data, const struct perf_dlfilter_sample *sample, void *ctx);
 143
 144/*
 145 * If implemented, return a one-line description of the filter, and optionally
 146 * a longer description.
 147 */
 148const char *filter_description(const char **long_description);
 149
 150#endif
 151