root/tools/perf/util/dso.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. dso__set_loaded
  2. __dso__zput
  3. dso__has_symbols
  4. dso__is_vmlinux
  5. dso__is_kcore
  6. dso__is_kallsyms

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef __PERF_DSO
   3 #define __PERF_DSO
   4 
   5 #include <pthread.h>
   6 #include <linux/refcount.h>
   7 #include <linux/types.h>
   8 #include <linux/rbtree.h>
   9 #include <sys/types.h>
  10 #include <stdbool.h>
  11 #include <stdio.h>
  12 #include <linux/bitops.h>
  13 #include "build-id.h"
  14 
  15 struct machine;
  16 struct map;
  17 struct perf_env;
  18 
  19 #define DSO__NAME_KALLSYMS      "[kernel.kallsyms]"
  20 #define DSO__NAME_KCORE         "[kernel.kcore]"
  21 
  22 enum dso_binary_type {
  23         DSO_BINARY_TYPE__KALLSYMS = 0,
  24         DSO_BINARY_TYPE__GUEST_KALLSYMS,
  25         DSO_BINARY_TYPE__VMLINUX,
  26         DSO_BINARY_TYPE__GUEST_VMLINUX,
  27         DSO_BINARY_TYPE__JAVA_JIT,
  28         DSO_BINARY_TYPE__DEBUGLINK,
  29         DSO_BINARY_TYPE__BUILD_ID_CACHE,
  30         DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO,
  31         DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
  32         DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
  33         DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
  34         DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
  35         DSO_BINARY_TYPE__GUEST_KMODULE,
  36         DSO_BINARY_TYPE__GUEST_KMODULE_COMP,
  37         DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE,
  38         DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP,
  39         DSO_BINARY_TYPE__KCORE,
  40         DSO_BINARY_TYPE__GUEST_KCORE,
  41         DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
  42         DSO_BINARY_TYPE__BPF_PROG_INFO,
  43         DSO_BINARY_TYPE__NOT_FOUND,
  44 };
  45 
  46 enum dso_kernel_type {
  47         DSO_TYPE_USER = 0,
  48         DSO_TYPE_KERNEL,
  49         DSO_TYPE_GUEST_KERNEL
  50 };
  51 
  52 enum dso_swap_type {
  53         DSO_SWAP__UNSET,
  54         DSO_SWAP__NO,
  55         DSO_SWAP__YES,
  56 };
  57 
  58 enum dso_data_status {
  59         DSO_DATA_STATUS_ERROR   = -1,
  60         DSO_DATA_STATUS_UNKNOWN = 0,
  61         DSO_DATA_STATUS_OK      = 1,
  62 };
  63 
  64 enum dso_data_status_seen {
  65         DSO_DATA_STATUS_SEEN_ITRACE,
  66 };
  67 
  68 enum dso_type {
  69         DSO__TYPE_UNKNOWN,
  70         DSO__TYPE_64BIT,
  71         DSO__TYPE_32BIT,
  72         DSO__TYPE_X32BIT,
  73 };
  74 
  75 enum dso_load_errno {
  76         DSO_LOAD_ERRNO__SUCCESS         = 0,
  77 
  78         /*
  79          * Choose an arbitrary negative big number not to clash with standard
  80          * errno since SUS requires the errno has distinct positive values.
  81          * See 'Issue 6' in the link below.
  82          *
  83          * http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html
  84          */
  85         __DSO_LOAD_ERRNO__START         = -10000,
  86 
  87         DSO_LOAD_ERRNO__INTERNAL_ERROR  = __DSO_LOAD_ERRNO__START,
  88 
  89         /* for symsrc__init() */
  90         DSO_LOAD_ERRNO__INVALID_ELF,
  91         DSO_LOAD_ERRNO__CANNOT_READ_BUILDID,
  92         DSO_LOAD_ERRNO__MISMATCHING_BUILDID,
  93 
  94         /* for decompress_kmodule */
  95         DSO_LOAD_ERRNO__DECOMPRESSION_FAILURE,
  96 
  97         __DSO_LOAD_ERRNO__END,
  98 };
  99 
 100 #define DSO__SWAP(dso, type, val)                       \
 101 ({                                                      \
 102         type ____r = val;                               \
 103         BUG_ON(dso->needs_swap == DSO_SWAP__UNSET);     \
 104         if (dso->needs_swap == DSO_SWAP__YES) {         \
 105                 switch (sizeof(____r)) {                \
 106                 case 2:                                 \
 107                         ____r = bswap_16(val);          \
 108                         break;                          \
 109                 case 4:                                 \
 110                         ____r = bswap_32(val);          \
 111                         break;                          \
 112                 case 8:                                 \
 113                         ____r = bswap_64(val);          \
 114                         break;                          \
 115                 default:                                \
 116                         BUG_ON(1);                      \
 117                 }                                       \
 118         }                                               \
 119         ____r;                                          \
 120 })
 121 
 122 #define DSO__DATA_CACHE_SIZE 4096
 123 #define DSO__DATA_CACHE_MASK ~(DSO__DATA_CACHE_SIZE - 1)
 124 
 125 struct dso_cache {
 126         struct rb_node  rb_node;
 127         u64 offset;
 128         u64 size;
 129         char data[0];
 130 };
 131 
 132 struct auxtrace_cache;
 133 
 134 struct dso {
 135         pthread_mutex_t  lock;
 136         struct list_head node;
 137         struct rb_node   rb_node;       /* rbtree node sorted by long name */
 138         struct rb_root   *root;         /* root of rbtree that rb_node is in */
 139         struct rb_root_cached symbols;
 140         struct rb_root_cached symbol_names;
 141         struct rb_root_cached inlined_nodes;
 142         struct rb_root_cached srclines;
 143         struct {
 144                 u64             addr;
 145                 struct symbol   *symbol;
 146         } last_find_result;
 147         void             *a2l;
 148         char             *symsrc_filename;
 149         unsigned int     a2l_fails;
 150         enum dso_kernel_type    kernel;
 151         enum dso_swap_type      needs_swap;
 152         enum dso_binary_type    symtab_type;
 153         enum dso_binary_type    binary_type;
 154         enum dso_load_errno     load_errno;
 155         u8               adjust_symbols:1;
 156         u8               has_build_id:1;
 157         u8               has_srcline:1;
 158         u8               hit:1;
 159         u8               annotate_warned:1;
 160         u8               short_name_allocated:1;
 161         u8               long_name_allocated:1;
 162         u8               is_64_bit:1;
 163         bool             sorted_by_name;
 164         bool             loaded;
 165         u8               rel;
 166         u8               build_id[BUILD_ID_SIZE];
 167         u64              text_offset;
 168         const char       *short_name;
 169         const char       *long_name;
 170         u16              long_name_len;
 171         u16              short_name_len;
 172         void            *dwfl;                  /* DWARF debug info */
 173         struct auxtrace_cache *auxtrace_cache;
 174         int              comp;
 175 
 176         /* dso data file */
 177         struct {
 178                 struct rb_root   cache;
 179                 int              fd;
 180                 int              status;
 181                 u32              status_seen;
 182                 size_t           file_size;
 183                 struct list_head open_entry;
 184                 u64              debug_frame_offset;
 185                 u64              eh_frame_hdr_offset;
 186         } data;
 187         /* bpf prog information */
 188         struct {
 189                 u32             id;
 190                 u32             sub_id;
 191                 struct perf_env *env;
 192         } bpf_prog;
 193 
 194         union { /* Tool specific area */
 195                 void     *priv;
 196                 u64      db_id;
 197         };
 198         struct nsinfo   *nsinfo;
 199         refcount_t       refcnt;
 200         char             name[0];
 201 };
 202 
 203 /* dso__for_each_symbol - iterate over the symbols of given type
 204  *
 205  * @dso: the 'struct dso *' in which symbols itereated
 206  * @pos: the 'struct symbol *' to use as a loop cursor
 207  * @n: the 'struct rb_node *' to use as a temporary storage
 208  */
 209 #define dso__for_each_symbol(dso, pos, n)       \
 210         symbols__for_each_entry(&(dso)->symbols, pos, n)
 211 
 212 static inline void dso__set_loaded(struct dso *dso)
 213 {
 214         dso->loaded = true;
 215 }
 216 
 217 struct dso *dso__new(const char *name);
 218 void dso__delete(struct dso *dso);
 219 
 220 void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated);
 221 void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated);
 222 
 223 int dso__name_len(const struct dso *dso);
 224 
 225 struct dso *dso__get(struct dso *dso);
 226 void dso__put(struct dso *dso);
 227 
 228 static inline void __dso__zput(struct dso **dso)
 229 {
 230         dso__put(*dso);
 231         *dso = NULL;
 232 }
 233 
 234 #define dso__zput(dso) __dso__zput(&dso)
 235 
 236 bool dso__loaded(const struct dso *dso);
 237 
 238 static inline bool dso__has_symbols(const struct dso *dso)
 239 {
 240         return !RB_EMPTY_ROOT(&dso->symbols.rb_root);
 241 }
 242 
 243 bool dso__sorted_by_name(const struct dso *dso);
 244 void dso__set_sorted_by_name(struct dso *dso);
 245 void dso__sort_by_name(struct dso *dso);
 246 
 247 void dso__set_build_id(struct dso *dso, void *build_id);
 248 bool dso__build_id_equal(const struct dso *dso, u8 *build_id);
 249 void dso__read_running_kernel_build_id(struct dso *dso,
 250                                        struct machine *machine);
 251 int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir);
 252 
 253 char dso__symtab_origin(const struct dso *dso);
 254 int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type,
 255                                    char *root_dir, char *filename, size_t size);
 256 bool is_kernel_module(const char *pathname, int cpumode);
 257 bool dso__needs_decompress(struct dso *dso);
 258 int dso__decompress_kmodule_fd(struct dso *dso, const char *name);
 259 int dso__decompress_kmodule_path(struct dso *dso, const char *name,
 260                                  char *pathname, size_t len);
 261 
 262 #define KMOD_DECOMP_NAME  "/tmp/perf-kmod-XXXXXX"
 263 #define KMOD_DECOMP_LEN   sizeof(KMOD_DECOMP_NAME)
 264 
 265 struct kmod_path {
 266         char *name;
 267         int   comp;
 268         bool  kmod;
 269 };
 270 
 271 int __kmod_path__parse(struct kmod_path *m, const char *path,
 272                      bool alloc_name);
 273 
 274 #define kmod_path__parse(__m, __p)      __kmod_path__parse(__m, __p, false)
 275 #define kmod_path__parse_name(__m, __p) __kmod_path__parse(__m, __p, true)
 276 
 277 void dso__set_module_info(struct dso *dso, struct kmod_path *m,
 278                           struct machine *machine);
 279 
 280 /*
 281  * The dso__data_* external interface provides following functions:
 282  *   dso__data_get_fd
 283  *   dso__data_put_fd
 284  *   dso__data_close
 285  *   dso__data_size
 286  *   dso__data_read_offset
 287  *   dso__data_read_addr
 288  *
 289  * Please refer to the dso.c object code for each function and
 290  * arguments documentation. Following text tries to explain the
 291  * dso file descriptor caching.
 292  *
 293  * The dso__data* interface allows caching of opened file descriptors
 294  * to speed up the dso data accesses. The idea is to leave the file
 295  * descriptor opened ideally for the whole life of the dso object.
 296  *
 297  * The current usage of the dso__data_* interface is as follows:
 298  *
 299  * Get DSO's fd:
 300  *   int fd = dso__data_get_fd(dso, machine);
 301  *   if (fd >= 0) {
 302  *       USE 'fd' SOMEHOW
 303  *       dso__data_put_fd(dso);
 304  *   }
 305  *
 306  * Read DSO's data:
 307  *   n = dso__data_read_offset(dso_0, &machine, 0, buf, BUFSIZE);
 308  *   n = dso__data_read_addr(dso_0, &machine, 0, buf, BUFSIZE);
 309  *
 310  * Eventually close DSO's fd:
 311  *   dso__data_close(dso);
 312  *
 313  * It is not necessary to close the DSO object data file. Each time new
 314  * DSO data file is opened, the limit (RLIMIT_NOFILE/2) is checked. Once
 315  * it is crossed, the oldest opened DSO object is closed.
 316  *
 317  * The dso__delete function calls close_dso function to ensure the
 318  * data file descriptor gets closed/unmapped before the dso object
 319  * is freed.
 320  *
 321  * TODO
 322 */
 323 int dso__data_get_fd(struct dso *dso, struct machine *machine);
 324 void dso__data_put_fd(struct dso *dso);
 325 void dso__data_close(struct dso *dso);
 326 
 327 int dso__data_file_size(struct dso *dso, struct machine *machine);
 328 off_t dso__data_size(struct dso *dso, struct machine *machine);
 329 ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
 330                               u64 offset, u8 *data, ssize_t size);
 331 ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
 332                             struct machine *machine, u64 addr,
 333                             u8 *data, ssize_t size);
 334 bool dso__data_status_seen(struct dso *dso, enum dso_data_status_seen by);
 335 
 336 struct map *dso__new_map(const char *name);
 337 struct dso *machine__findnew_kernel(struct machine *machine, const char *name,
 338                                     const char *short_name, int dso_type);
 339 
 340 void dso__reset_find_symbol_cache(struct dso *dso);
 341 
 342 size_t dso__fprintf_buildid(struct dso *dso, FILE *fp);
 343 size_t dso__fprintf_symbols_by_name(struct dso *dso, FILE *fp);
 344 size_t dso__fprintf(struct dso *dso, FILE *fp);
 345 
 346 static inline bool dso__is_vmlinux(struct dso *dso)
 347 {
 348         return dso->binary_type == DSO_BINARY_TYPE__VMLINUX ||
 349                dso->binary_type == DSO_BINARY_TYPE__GUEST_VMLINUX;
 350 }
 351 
 352 static inline bool dso__is_kcore(struct dso *dso)
 353 {
 354         return dso->binary_type == DSO_BINARY_TYPE__KCORE ||
 355                dso->binary_type == DSO_BINARY_TYPE__GUEST_KCORE;
 356 }
 357 
 358 static inline bool dso__is_kallsyms(struct dso *dso)
 359 {
 360         return dso->kernel && dso->long_name[0] != '/';
 361 }
 362 
 363 void dso__free_a2l(struct dso *dso);
 364 
 365 enum dso_type dso__type(struct dso *dso, struct machine *machine);
 366 
 367 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen);
 368 
 369 void reset_fd_limit(void);
 370 
 371 #endif /* __PERF_DSO */

/* [<][>][^][v][top][bottom][index][help] */