linux/tools/perf/util/dso.h
<<
>>
Prefs
   1#ifndef __PERF_DSO
   2#define __PERF_DSO
   3
   4#include <linux/types.h>
   5#include <linux/rbtree.h>
   6#include <stdbool.h>
   7#include "types.h"
   8#include "map.h"
   9
  10enum dso_binary_type {
  11        DSO_BINARY_TYPE__KALLSYMS = 0,
  12        DSO_BINARY_TYPE__GUEST_KALLSYMS,
  13        DSO_BINARY_TYPE__VMLINUX,
  14        DSO_BINARY_TYPE__GUEST_VMLINUX,
  15        DSO_BINARY_TYPE__JAVA_JIT,
  16        DSO_BINARY_TYPE__DEBUGLINK,
  17        DSO_BINARY_TYPE__BUILD_ID_CACHE,
  18        DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
  19        DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
  20        DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
  21        DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
  22        DSO_BINARY_TYPE__GUEST_KMODULE,
  23        DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE,
  24        DSO_BINARY_TYPE__KCORE,
  25        DSO_BINARY_TYPE__GUEST_KCORE,
  26        DSO_BINARY_TYPE__NOT_FOUND,
  27};
  28
  29enum dso_kernel_type {
  30        DSO_TYPE_USER = 0,
  31        DSO_TYPE_KERNEL,
  32        DSO_TYPE_GUEST_KERNEL
  33};
  34
  35enum dso_swap_type {
  36        DSO_SWAP__UNSET,
  37        DSO_SWAP__NO,
  38        DSO_SWAP__YES,
  39};
  40
  41#define DSO__SWAP(dso, type, val)                       \
  42({                                                      \
  43        type ____r = val;                               \
  44        BUG_ON(dso->needs_swap == DSO_SWAP__UNSET);     \
  45        if (dso->needs_swap == DSO_SWAP__YES) {         \
  46                switch (sizeof(____r)) {                \
  47                case 2:                                 \
  48                        ____r = bswap_16(val);          \
  49                        break;                          \
  50                case 4:                                 \
  51                        ____r = bswap_32(val);          \
  52                        break;                          \
  53                case 8:                                 \
  54                        ____r = bswap_64(val);          \
  55                        break;                          \
  56                default:                                \
  57                        BUG_ON(1);                      \
  58                }                                       \
  59        }                                               \
  60        ____r;                                          \
  61})
  62
  63#define DSO__DATA_CACHE_SIZE 4096
  64#define DSO__DATA_CACHE_MASK ~(DSO__DATA_CACHE_SIZE - 1)
  65
  66struct dso_cache {
  67        struct rb_node  rb_node;
  68        u64 offset;
  69        u64 size;
  70        char data[0];
  71};
  72
  73struct dso {
  74        struct list_head node;
  75        struct rb_root   symbols[MAP__NR_TYPES];
  76        struct rb_root   symbol_names[MAP__NR_TYPES];
  77        struct rb_root   cache;
  78        enum dso_kernel_type    kernel;
  79        enum dso_swap_type      needs_swap;
  80        enum dso_binary_type    symtab_type;
  81        enum dso_binary_type    data_type;
  82        u8               adjust_symbols:1;
  83        u8               has_build_id:1;
  84        u8               hit:1;
  85        u8               annotate_warned:1;
  86        u8               sname_alloc:1;
  87        u8               lname_alloc:1;
  88        u8               sorted_by_name;
  89        u8               loaded;
  90        u8               rel;
  91        u8               build_id[BUILD_ID_SIZE];
  92        const char       *short_name;
  93        char             *long_name;
  94        u16              long_name_len;
  95        u16              short_name_len;
  96        char             name[0];
  97};
  98
  99static inline void dso__set_loaded(struct dso *dso, enum map_type type)
 100{
 101        dso->loaded |= (1 << type);
 102}
 103
 104struct dso *dso__new(const char *name);
 105void dso__delete(struct dso *dso);
 106
 107void dso__set_short_name(struct dso *dso, const char *name);
 108void dso__set_long_name(struct dso *dso, char *name);
 109
 110int dso__name_len(const struct dso *dso);
 111
 112bool dso__loaded(const struct dso *dso, enum map_type type);
 113
 114bool dso__sorted_by_name(const struct dso *dso, enum map_type type);
 115void dso__set_sorted_by_name(struct dso *dso, enum map_type type);
 116void dso__sort_by_name(struct dso *dso, enum map_type type);
 117
 118void dso__set_build_id(struct dso *dso, void *build_id);
 119bool dso__build_id_equal(const struct dso *dso, u8 *build_id);
 120void dso__read_running_kernel_build_id(struct dso *dso,
 121                                       struct machine *machine);
 122int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir);
 123
 124char dso__symtab_origin(const struct dso *dso);
 125int dso__binary_type_file(struct dso *dso, enum dso_binary_type type,
 126                          char *root_dir, char *file, size_t size);
 127
 128int dso__data_fd(struct dso *dso, struct machine *machine);
 129ssize_t dso__data_read_offset(struct dso *dso, struct machine *machine,
 130                              u64 offset, u8 *data, ssize_t size);
 131ssize_t dso__data_read_addr(struct dso *dso, struct map *map,
 132                            struct machine *machine, u64 addr,
 133                            u8 *data, ssize_t size);
 134
 135struct map *dso__new_map(const char *name);
 136struct dso *dso__kernel_findnew(struct machine *machine, const char *name,
 137                                const char *short_name, int dso_type);
 138
 139void dsos__add(struct list_head *head, struct dso *dso);
 140struct dso *dsos__find(struct list_head *head, const char *name,
 141                       bool cmp_short);
 142struct dso *__dsos__findnew(struct list_head *head, const char *name);
 143bool __dsos__read_build_ids(struct list_head *head, bool with_hits);
 144
 145size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
 146                               bool (skip)(struct dso *dso, int parm), int parm);
 147size_t __dsos__fprintf(struct list_head *head, FILE *fp);
 148
 149size_t dso__fprintf_buildid(struct dso *dso, FILE *fp);
 150size_t dso__fprintf_symbols_by_name(struct dso *dso,
 151                                    enum map_type type, FILE *fp);
 152size_t dso__fprintf(struct dso *dso, enum map_type type, FILE *fp);
 153
 154static inline bool dso__is_vmlinux(struct dso *dso)
 155{
 156        return dso->data_type == DSO_BINARY_TYPE__VMLINUX ||
 157               dso->data_type == DSO_BINARY_TYPE__GUEST_VMLINUX;
 158}
 159
 160static inline bool dso__is_kcore(struct dso *dso)
 161{
 162        return dso->data_type == DSO_BINARY_TYPE__KCORE ||
 163               dso->data_type == DSO_BINARY_TYPE__GUEST_KCORE;
 164}
 165
 166#endif /* __PERF_DSO */
 167