linux/tools/perf/util/symbol.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2#include <dirent.h>
   3#include <errno.h>
   4#include <stdlib.h>
   5#include <stdio.h>
   6#include <string.h>
   7#include <linux/capability.h>
   8#include <linux/kernel.h>
   9#include <linux/mman.h>
  10#include <linux/string.h>
  11#include <linux/time64.h>
  12#include <sys/types.h>
  13#include <sys/stat.h>
  14#include <sys/param.h>
  15#include <fcntl.h>
  16#include <unistd.h>
  17#include <inttypes.h>
  18#include "annotate.h"
  19#include "build-id.h"
  20#include "cap.h"
  21#include "dso.h"
  22#include "util.h" // lsdir()
  23#include "debug.h"
  24#include "event.h"
  25#include "machine.h"
  26#include "map.h"
  27#include "symbol.h"
  28#include "map_symbol.h"
  29#include "mem-events.h"
  30#include "symsrc.h"
  31#include "strlist.h"
  32#include "intlist.h"
  33#include "namespaces.h"
  34#include "header.h"
  35#include "path.h"
  36#include <linux/ctype.h>
  37#include <linux/zalloc.h>
  38
  39#include <elf.h>
  40#include <limits.h>
  41#include <symbol/kallsyms.h>
  42#include <sys/utsname.h>
  43
  44static int dso__load_kernel_sym(struct dso *dso, struct map *map);
  45static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map);
  46static bool symbol__is_idle(const char *name);
  47
  48int vmlinux_path__nr_entries;
  49char **vmlinux_path;
  50
  51struct symbol_conf symbol_conf = {
  52        .nanosecs               = false,
  53        .use_modules            = true,
  54        .try_vmlinux_path       = true,
  55        .demangle               = true,
  56        .demangle_kernel        = false,
  57        .cumulate_callchain     = true,
  58        .time_quantum           = 100 * NSEC_PER_MSEC, /* 100ms */
  59        .show_hist_headers      = true,
  60        .symfs                  = "",
  61        .event_group            = true,
  62        .inline_name            = true,
  63        .res_sample             = 0,
  64};
  65
  66static enum dso_binary_type binary_type_symtab[] = {
  67        DSO_BINARY_TYPE__KALLSYMS,
  68        DSO_BINARY_TYPE__GUEST_KALLSYMS,
  69        DSO_BINARY_TYPE__JAVA_JIT,
  70        DSO_BINARY_TYPE__DEBUGLINK,
  71        DSO_BINARY_TYPE__BUILD_ID_CACHE,
  72        DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO,
  73        DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
  74        DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
  75        DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
  76        DSO_BINARY_TYPE__SYSTEM_PATH_DSO,
  77        DSO_BINARY_TYPE__GUEST_KMODULE,
  78        DSO_BINARY_TYPE__GUEST_KMODULE_COMP,
  79        DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE,
  80        DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP,
  81        DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
  82        DSO_BINARY_TYPE__NOT_FOUND,
  83};
  84
  85#define DSO_BINARY_TYPE__SYMTAB_CNT ARRAY_SIZE(binary_type_symtab)
  86
  87static bool symbol_type__filter(char symbol_type)
  88{
  89        symbol_type = toupper(symbol_type);
  90        return symbol_type == 'T' || symbol_type == 'W' || symbol_type == 'D' || symbol_type == 'B';
  91}
  92
  93static int prefix_underscores_count(const char *str)
  94{
  95        const char *tail = str;
  96
  97        while (*tail == '_')
  98                tail++;
  99
 100        return tail - str;
 101}
 102
 103void __weak arch__symbols__fixup_end(struct symbol *p, struct symbol *c)
 104{
 105        p->end = c->start;
 106}
 107
 108const char * __weak arch__normalize_symbol_name(const char *name)
 109{
 110        return name;
 111}
 112
 113int __weak arch__compare_symbol_names(const char *namea, const char *nameb)
 114{
 115        return strcmp(namea, nameb);
 116}
 117
 118int __weak arch__compare_symbol_names_n(const char *namea, const char *nameb,
 119                                        unsigned int n)
 120{
 121        return strncmp(namea, nameb, n);
 122}
 123
 124int __weak arch__choose_best_symbol(struct symbol *syma,
 125                                    struct symbol *symb __maybe_unused)
 126{
 127        /* Avoid "SyS" kernel syscall aliases */
 128        if (strlen(syma->name) >= 3 && !strncmp(syma->name, "SyS", 3))
 129                return SYMBOL_B;
 130        if (strlen(syma->name) >= 10 && !strncmp(syma->name, "compat_SyS", 10))
 131                return SYMBOL_B;
 132
 133        return SYMBOL_A;
 134}
 135
 136static int choose_best_symbol(struct symbol *syma, struct symbol *symb)
 137{
 138        s64 a;
 139        s64 b;
 140        size_t na, nb;
 141
 142        /* Prefer a symbol with non zero length */
 143        a = syma->end - syma->start;
 144        b = symb->end - symb->start;
 145        if ((b == 0) && (a > 0))
 146                return SYMBOL_A;
 147        else if ((a == 0) && (b > 0))
 148                return SYMBOL_B;
 149
 150        /* Prefer a non weak symbol over a weak one */
 151        a = syma->binding == STB_WEAK;
 152        b = symb->binding == STB_WEAK;
 153        if (b && !a)
 154                return SYMBOL_A;
 155        if (a && !b)
 156                return SYMBOL_B;
 157
 158        /* Prefer a global symbol over a non global one */
 159        a = syma->binding == STB_GLOBAL;
 160        b = symb->binding == STB_GLOBAL;
 161        if (a && !b)
 162                return SYMBOL_A;
 163        if (b && !a)
 164                return SYMBOL_B;
 165
 166        /* Prefer a symbol with less underscores */
 167        a = prefix_underscores_count(syma->name);
 168        b = prefix_underscores_count(symb->name);
 169        if (b > a)
 170                return SYMBOL_A;
 171        else if (a > b)
 172                return SYMBOL_B;
 173
 174        /* Choose the symbol with the longest name */
 175        na = strlen(syma->name);
 176        nb = strlen(symb->name);
 177        if (na > nb)
 178                return SYMBOL_A;
 179        else if (na < nb)
 180                return SYMBOL_B;
 181
 182        return arch__choose_best_symbol(syma, symb);
 183}
 184
 185void symbols__fixup_duplicate(struct rb_root_cached *symbols)
 186{
 187        struct rb_node *nd;
 188        struct symbol *curr, *next;
 189
 190        if (symbol_conf.allow_aliases)
 191                return;
 192
 193        nd = rb_first_cached(symbols);
 194
 195        while (nd) {
 196                curr = rb_entry(nd, struct symbol, rb_node);
 197again:
 198                nd = rb_next(&curr->rb_node);
 199                next = rb_entry(nd, struct symbol, rb_node);
 200
 201                if (!nd)
 202                        break;
 203
 204                if (curr->start != next->start)
 205                        continue;
 206
 207                if (choose_best_symbol(curr, next) == SYMBOL_A) {
 208                        rb_erase_cached(&next->rb_node, symbols);
 209                        symbol__delete(next);
 210                        goto again;
 211                } else {
 212                        nd = rb_next(&curr->rb_node);
 213                        rb_erase_cached(&curr->rb_node, symbols);
 214                        symbol__delete(curr);
 215                }
 216        }
 217}
 218
 219void symbols__fixup_end(struct rb_root_cached *symbols)
 220{
 221        struct rb_node *nd, *prevnd = rb_first_cached(symbols);
 222        struct symbol *curr, *prev;
 223
 224        if (prevnd == NULL)
 225                return;
 226
 227        curr = rb_entry(prevnd, struct symbol, rb_node);
 228
 229        for (nd = rb_next(prevnd); nd; nd = rb_next(nd)) {
 230                prev = curr;
 231                curr = rb_entry(nd, struct symbol, rb_node);
 232
 233                if (prev->end == prev->start && prev->end != curr->start)
 234                        arch__symbols__fixup_end(prev, curr);
 235        }
 236
 237        /* Last entry */
 238        if (curr->end == curr->start)
 239                curr->end = roundup(curr->start, 4096) + 4096;
 240}
 241
 242void maps__fixup_end(struct maps *maps)
 243{
 244        struct map *prev = NULL, *curr;
 245
 246        down_write(&maps->lock);
 247
 248        maps__for_each_entry(maps, curr) {
 249                if (prev != NULL && !prev->end)
 250                        prev->end = curr->start;
 251
 252                prev = curr;
 253        }
 254
 255        /*
 256         * We still haven't the actual symbols, so guess the
 257         * last map final address.
 258         */
 259        if (curr && !curr->end)
 260                curr->end = ~0ULL;
 261
 262        up_write(&maps->lock);
 263}
 264
 265struct symbol *symbol__new(u64 start, u64 len, u8 binding, u8 type, const char *name)
 266{
 267        size_t namelen = strlen(name) + 1;
 268        struct symbol *sym = calloc(1, (symbol_conf.priv_size +
 269                                        sizeof(*sym) + namelen));
 270        if (sym == NULL)
 271                return NULL;
 272
 273        if (symbol_conf.priv_size) {
 274                if (symbol_conf.init_annotation) {
 275                        struct annotation *notes = (void *)sym;
 276                        pthread_mutex_init(&notes->lock, NULL);
 277                }
 278                sym = ((void *)sym) + symbol_conf.priv_size;
 279        }
 280
 281        sym->start   = start;
 282        sym->end     = len ? start + len : start;
 283        sym->type    = type;
 284        sym->binding = binding;
 285        sym->namelen = namelen - 1;
 286
 287        pr_debug4("%s: %s %#" PRIx64 "-%#" PRIx64 "\n",
 288                  __func__, name, start, sym->end);
 289        memcpy(sym->name, name, namelen);
 290
 291        return sym;
 292}
 293
 294void symbol__delete(struct symbol *sym)
 295{
 296        free(((void *)sym) - symbol_conf.priv_size);
 297}
 298
 299void symbols__delete(struct rb_root_cached *symbols)
 300{
 301        struct symbol *pos;
 302        struct rb_node *next = rb_first_cached(symbols);
 303
 304        while (next) {
 305                pos = rb_entry(next, struct symbol, rb_node);
 306                next = rb_next(&pos->rb_node);
 307                rb_erase_cached(&pos->rb_node, symbols);
 308                symbol__delete(pos);
 309        }
 310}
 311
 312void __symbols__insert(struct rb_root_cached *symbols,
 313                       struct symbol *sym, bool kernel)
 314{
 315        struct rb_node **p = &symbols->rb_root.rb_node;
 316        struct rb_node *parent = NULL;
 317        const u64 ip = sym->start;
 318        struct symbol *s;
 319        bool leftmost = true;
 320
 321        if (kernel) {
 322                const char *name = sym->name;
 323                /*
 324                 * ppc64 uses function descriptors and appends a '.' to the
 325                 * start of every instruction address. Remove it.
 326                 */
 327                if (name[0] == '.')
 328                        name++;
 329                sym->idle = symbol__is_idle(name);
 330        }
 331
 332        while (*p != NULL) {
 333                parent = *p;
 334                s = rb_entry(parent, struct symbol, rb_node);
 335                if (ip < s->start)
 336                        p = &(*p)->rb_left;
 337                else {
 338                        p = &(*p)->rb_right;
 339                        leftmost = false;
 340                }
 341        }
 342        rb_link_node(&sym->rb_node, parent, p);
 343        rb_insert_color_cached(&sym->rb_node, symbols, leftmost);
 344}
 345
 346void symbols__insert(struct rb_root_cached *symbols, struct symbol *sym)
 347{
 348        __symbols__insert(symbols, sym, false);
 349}
 350
 351static struct symbol *symbols__find(struct rb_root_cached *symbols, u64 ip)
 352{
 353        struct rb_node *n;
 354
 355        if (symbols == NULL)
 356                return NULL;
 357
 358        n = symbols->rb_root.rb_node;
 359
 360        while (n) {
 361                struct symbol *s = rb_entry(n, struct symbol, rb_node);
 362
 363                if (ip < s->start)
 364                        n = n->rb_left;
 365                else if (ip > s->end || (ip == s->end && ip != s->start))
 366                        n = n->rb_right;
 367                else
 368                        return s;
 369        }
 370
 371        return NULL;
 372}
 373
 374static struct symbol *symbols__first(struct rb_root_cached *symbols)
 375{
 376        struct rb_node *n = rb_first_cached(symbols);
 377
 378        if (n)
 379                return rb_entry(n, struct symbol, rb_node);
 380
 381        return NULL;
 382}
 383
 384static struct symbol *symbols__last(struct rb_root_cached *symbols)
 385{
 386        struct rb_node *n = rb_last(&symbols->rb_root);
 387
 388        if (n)
 389                return rb_entry(n, struct symbol, rb_node);
 390
 391        return NULL;
 392}
 393
 394static struct symbol *symbols__next(struct symbol *sym)
 395{
 396        struct rb_node *n = rb_next(&sym->rb_node);
 397
 398        if (n)
 399                return rb_entry(n, struct symbol, rb_node);
 400
 401        return NULL;
 402}
 403
 404static void symbols__insert_by_name(struct rb_root_cached *symbols, struct symbol *sym)
 405{
 406        struct rb_node **p = &symbols->rb_root.rb_node;
 407        struct rb_node *parent = NULL;
 408        struct symbol_name_rb_node *symn, *s;
 409        bool leftmost = true;
 410
 411        symn = container_of(sym, struct symbol_name_rb_node, sym);
 412
 413        while (*p != NULL) {
 414                parent = *p;
 415                s = rb_entry(parent, struct symbol_name_rb_node, rb_node);
 416                if (strcmp(sym->name, s->sym.name) < 0)
 417                        p = &(*p)->rb_left;
 418                else {
 419                        p = &(*p)->rb_right;
 420                        leftmost = false;
 421                }
 422        }
 423        rb_link_node(&symn->rb_node, parent, p);
 424        rb_insert_color_cached(&symn->rb_node, symbols, leftmost);
 425}
 426
 427static void symbols__sort_by_name(struct rb_root_cached *symbols,
 428                                  struct rb_root_cached *source)
 429{
 430        struct rb_node *nd;
 431
 432        for (nd = rb_first_cached(source); nd; nd = rb_next(nd)) {
 433                struct symbol *pos = rb_entry(nd, struct symbol, rb_node);
 434                symbols__insert_by_name(symbols, pos);
 435        }
 436}
 437
 438int symbol__match_symbol_name(const char *name, const char *str,
 439                              enum symbol_tag_include includes)
 440{
 441        const char *versioning;
 442
 443        if (includes == SYMBOL_TAG_INCLUDE__DEFAULT_ONLY &&
 444            (versioning = strstr(name, "@@"))) {
 445                int len = strlen(str);
 446
 447                if (len < versioning - name)
 448                        len = versioning - name;
 449
 450                return arch__compare_symbol_names_n(name, str, len);
 451        } else
 452                return arch__compare_symbol_names(name, str);
 453}
 454
 455static struct symbol *symbols__find_by_name(struct rb_root_cached *symbols,
 456                                            const char *name,
 457                                            enum symbol_tag_include includes)
 458{
 459        struct rb_node *n;
 460        struct symbol_name_rb_node *s = NULL;
 461
 462        if (symbols == NULL)
 463                return NULL;
 464
 465        n = symbols->rb_root.rb_node;
 466
 467        while (n) {
 468                int cmp;
 469
 470                s = rb_entry(n, struct symbol_name_rb_node, rb_node);
 471                cmp = symbol__match_symbol_name(s->sym.name, name, includes);
 472
 473                if (cmp > 0)
 474                        n = n->rb_left;
 475                else if (cmp < 0)
 476                        n = n->rb_right;
 477                else
 478                        break;
 479        }
 480
 481        if (n == NULL)
 482                return NULL;
 483
 484        if (includes != SYMBOL_TAG_INCLUDE__DEFAULT_ONLY)
 485                /* return first symbol that has same name (if any) */
 486                for (n = rb_prev(n); n; n = rb_prev(n)) {
 487                        struct symbol_name_rb_node *tmp;
 488
 489                        tmp = rb_entry(n, struct symbol_name_rb_node, rb_node);
 490                        if (arch__compare_symbol_names(tmp->sym.name, s->sym.name))
 491                                break;
 492
 493                        s = tmp;
 494                }
 495
 496        return &s->sym;
 497}
 498
 499void dso__reset_find_symbol_cache(struct dso *dso)
 500{
 501        dso->last_find_result.addr   = 0;
 502        dso->last_find_result.symbol = NULL;
 503}
 504
 505void dso__insert_symbol(struct dso *dso, struct symbol *sym)
 506{
 507        __symbols__insert(&dso->symbols, sym, dso->kernel);
 508
 509        /* update the symbol cache if necessary */
 510        if (dso->last_find_result.addr >= sym->start &&
 511            (dso->last_find_result.addr < sym->end ||
 512            sym->start == sym->end)) {
 513                dso->last_find_result.symbol = sym;
 514        }
 515}
 516
 517struct symbol *dso__find_symbol(struct dso *dso, u64 addr)
 518{
 519        if (dso->last_find_result.addr != addr || dso->last_find_result.symbol == NULL) {
 520                dso->last_find_result.addr   = addr;
 521                dso->last_find_result.symbol = symbols__find(&dso->symbols, addr);
 522        }
 523
 524        return dso->last_find_result.symbol;
 525}
 526
 527struct symbol *dso__first_symbol(struct dso *dso)
 528{
 529        return symbols__first(&dso->symbols);
 530}
 531
 532struct symbol *dso__last_symbol(struct dso *dso)
 533{
 534        return symbols__last(&dso->symbols);
 535}
 536
 537struct symbol *dso__next_symbol(struct symbol *sym)
 538{
 539        return symbols__next(sym);
 540}
 541
 542struct symbol *symbol__next_by_name(struct symbol *sym)
 543{
 544        struct symbol_name_rb_node *s = container_of(sym, struct symbol_name_rb_node, sym);
 545        struct rb_node *n = rb_next(&s->rb_node);
 546
 547        return n ? &rb_entry(n, struct symbol_name_rb_node, rb_node)->sym : NULL;
 548}
 549
 550 /*
 551  * Returns first symbol that matched with @name.
 552  */
 553struct symbol *dso__find_symbol_by_name(struct dso *dso, const char *name)
 554{
 555        struct symbol *s = symbols__find_by_name(&dso->symbol_names, name,
 556                                                 SYMBOL_TAG_INCLUDE__NONE);
 557        if (!s)
 558                s = symbols__find_by_name(&dso->symbol_names, name,
 559                                          SYMBOL_TAG_INCLUDE__DEFAULT_ONLY);
 560        return s;
 561}
 562
 563void dso__sort_by_name(struct dso *dso)
 564{
 565        dso__set_sorted_by_name(dso);
 566        return symbols__sort_by_name(&dso->symbol_names, &dso->symbols);
 567}
 568
 569int modules__parse(const char *filename, void *arg,
 570                   int (*process_module)(void *arg, const char *name,
 571                                         u64 start, u64 size))
 572{
 573        char *line = NULL;
 574        size_t n;
 575        FILE *file;
 576        int err = 0;
 577
 578        file = fopen(filename, "r");
 579        if (file == NULL)
 580                return -1;
 581
 582        while (1) {
 583                char name[PATH_MAX];
 584                u64 start, size;
 585                char *sep, *endptr;
 586                ssize_t line_len;
 587
 588                line_len = getline(&line, &n, file);
 589                if (line_len < 0) {
 590                        if (feof(file))
 591                                break;
 592                        err = -1;
 593                        goto out;
 594                }
 595
 596                if (!line) {
 597                        err = -1;
 598                        goto out;
 599                }
 600
 601                line[--line_len] = '\0'; /* \n */
 602
 603                sep = strrchr(line, 'x');
 604                if (sep == NULL)
 605                        continue;
 606
 607                hex2u64(sep + 1, &start);
 608
 609                sep = strchr(line, ' ');
 610                if (sep == NULL)
 611                        continue;
 612
 613                *sep = '\0';
 614
 615                scnprintf(name, sizeof(name), "[%s]", line);
 616
 617                size = strtoul(sep + 1, &endptr, 0);
 618                if (*endptr != ' ' && *endptr != '\t')
 619                        continue;
 620
 621                err = process_module(arg, name, start, size);
 622                if (err)
 623                        break;
 624        }
 625out:
 626        free(line);
 627        fclose(file);
 628        return err;
 629}
 630
 631/*
 632 * These are symbols in the kernel image, so make sure that
 633 * sym is from a kernel DSO.
 634 */
 635static bool symbol__is_idle(const char *name)
 636{
 637        const char * const idle_symbols[] = {
 638                "acpi_idle_do_entry",
 639                "acpi_processor_ffh_cstate_enter",
 640                "arch_cpu_idle",
 641                "cpu_idle",
 642                "cpu_startup_entry",
 643                "idle_cpu",
 644                "intel_idle",
 645                "default_idle",
 646                "native_safe_halt",
 647                "enter_idle",
 648                "exit_idle",
 649                "mwait_idle",
 650                "mwait_idle_with_hints",
 651                "poll_idle",
 652                "ppc64_runlatch_off",
 653                "pseries_dedicated_idle_sleep",
 654                NULL
 655        };
 656        int i;
 657        static struct strlist *idle_symbols_list;
 658
 659        if (idle_symbols_list)
 660                return strlist__has_entry(idle_symbols_list, name);
 661
 662        idle_symbols_list = strlist__new(NULL, NULL);
 663
 664        for (i = 0; idle_symbols[i]; i++)
 665                strlist__add(idle_symbols_list, idle_symbols[i]);
 666
 667        return strlist__has_entry(idle_symbols_list, name);
 668}
 669
 670static int map__process_kallsym_symbol(void *arg, const char *name,
 671                                       char type, u64 start)
 672{
 673        struct symbol *sym;
 674        struct dso *dso = arg;
 675        struct rb_root_cached *root = &dso->symbols;
 676
 677        if (!symbol_type__filter(type))
 678                return 0;
 679
 680        /*
 681         * module symbols are not sorted so we add all
 682         * symbols, setting length to 0, and rely on
 683         * symbols__fixup_end() to fix it up.
 684         */
 685        sym = symbol__new(start, 0, kallsyms2elf_binding(type), kallsyms2elf_type(type), name);
 686        if (sym == NULL)
 687                return -ENOMEM;
 688        /*
 689         * We will pass the symbols to the filter later, in
 690         * map__split_kallsyms, when we have split the maps per module
 691         */
 692        __symbols__insert(root, sym, !strchr(name, '['));
 693
 694        return 0;
 695}
 696
 697/*
 698 * Loads the function entries in /proc/kallsyms into kernel_map->dso,
 699 * so that we can in the next step set the symbol ->end address and then
 700 * call kernel_maps__split_kallsyms.
 701 */
 702static int dso__load_all_kallsyms(struct dso *dso, const char *filename)
 703{
 704        return kallsyms__parse(filename, dso, map__process_kallsym_symbol);
 705}
 706
 707static int maps__split_kallsyms_for_kcore(struct maps *kmaps, struct dso *dso)
 708{
 709        struct map *curr_map;
 710        struct symbol *pos;
 711        int count = 0;
 712        struct rb_root_cached old_root = dso->symbols;
 713        struct rb_root_cached *root = &dso->symbols;
 714        struct rb_node *next = rb_first_cached(root);
 715
 716        if (!kmaps)
 717                return -1;
 718
 719        *root = RB_ROOT_CACHED;
 720
 721        while (next) {
 722                char *module;
 723
 724                pos = rb_entry(next, struct symbol, rb_node);
 725                next = rb_next(&pos->rb_node);
 726
 727                rb_erase_cached(&pos->rb_node, &old_root);
 728                RB_CLEAR_NODE(&pos->rb_node);
 729                module = strchr(pos->name, '\t');
 730                if (module)
 731                        *module = '\0';
 732
 733                curr_map = maps__find(kmaps, pos->start);
 734
 735                if (!curr_map) {
 736                        symbol__delete(pos);
 737                        continue;
 738                }
 739
 740                pos->start -= curr_map->start - curr_map->pgoff;
 741                if (pos->end > curr_map->end)
 742                        pos->end = curr_map->end;
 743                if (pos->end)
 744                        pos->end -= curr_map->start - curr_map->pgoff;
 745                symbols__insert(&curr_map->dso->symbols, pos);
 746                ++count;
 747        }
 748
 749        /* Symbols have been adjusted */
 750        dso->adjust_symbols = 1;
 751
 752        return count;
 753}
 754
 755/*
 756 * Split the symbols into maps, making sure there are no overlaps, i.e. the
 757 * kernel range is broken in several maps, named [kernel].N, as we don't have
 758 * the original ELF section names vmlinux have.
 759 */
 760static int maps__split_kallsyms(struct maps *kmaps, struct dso *dso, u64 delta,
 761                                struct map *initial_map)
 762{
 763        struct machine *machine;
 764        struct map *curr_map = initial_map;
 765        struct symbol *pos;
 766        int count = 0, moved = 0;
 767        struct rb_root_cached *root = &dso->symbols;
 768        struct rb_node *next = rb_first_cached(root);
 769        int kernel_range = 0;
 770        bool x86_64;
 771
 772        if (!kmaps)
 773                return -1;
 774
 775        machine = kmaps->machine;
 776
 777        x86_64 = machine__is(machine, "x86_64");
 778
 779        while (next) {
 780                char *module;
 781
 782                pos = rb_entry(next, struct symbol, rb_node);
 783                next = rb_next(&pos->rb_node);
 784
 785                module = strchr(pos->name, '\t');
 786                if (module) {
 787                        if (!symbol_conf.use_modules)
 788                                goto discard_symbol;
 789
 790                        *module++ = '\0';
 791
 792                        if (strcmp(curr_map->dso->short_name, module)) {
 793                                if (curr_map != initial_map &&
 794                                    dso->kernel == DSO_TYPE_GUEST_KERNEL &&
 795                                    machine__is_default_guest(machine)) {
 796                                        /*
 797                                         * We assume all symbols of a module are
 798                                         * continuous in * kallsyms, so curr_map
 799                                         * points to a module and all its
 800                                         * symbols are in its kmap. Mark it as
 801                                         * loaded.
 802                                         */
 803                                        dso__set_loaded(curr_map->dso);
 804                                }
 805
 806                                curr_map = maps__find_by_name(kmaps, module);
 807                                if (curr_map == NULL) {
 808                                        pr_debug("%s/proc/{kallsyms,modules} "
 809                                                 "inconsistency while looking "
 810                                                 "for \"%s\" module!\n",
 811                                                 machine->root_dir, module);
 812                                        curr_map = initial_map;
 813                                        goto discard_symbol;
 814                                }
 815
 816                                if (curr_map->dso->loaded &&
 817                                    !machine__is_default_guest(machine))
 818                                        goto discard_symbol;
 819                        }
 820                        /*
 821                         * So that we look just like we get from .ko files,
 822                         * i.e. not prelinked, relative to initial_map->start.
 823                         */
 824                        pos->start = curr_map->map_ip(curr_map, pos->start);
 825                        pos->end   = curr_map->map_ip(curr_map, pos->end);
 826                } else if (x86_64 && is_entry_trampoline(pos->name)) {
 827                        /*
 828                         * These symbols are not needed anymore since the
 829                         * trampoline maps refer to the text section and it's
 830                         * symbols instead. Avoid having to deal with
 831                         * relocations, and the assumption that the first symbol
 832                         * is the start of kernel text, by simply removing the
 833                         * symbols at this point.
 834                         */
 835                        goto discard_symbol;
 836                } else if (curr_map != initial_map) {
 837                        char dso_name[PATH_MAX];
 838                        struct dso *ndso;
 839
 840                        if (delta) {
 841                                /* Kernel was relocated at boot time */
 842                                pos->start -= delta;
 843                                pos->end -= delta;
 844                        }
 845
 846                        if (count == 0) {
 847                                curr_map = initial_map;
 848                                goto add_symbol;
 849                        }
 850
 851                        if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
 852                                snprintf(dso_name, sizeof(dso_name),
 853                                        "[guest.kernel].%d",
 854                                        kernel_range++);
 855                        else
 856                                snprintf(dso_name, sizeof(dso_name),
 857                                        "[kernel].%d",
 858                                        kernel_range++);
 859
 860                        ndso = dso__new(dso_name);
 861                        if (ndso == NULL)
 862                                return -1;
 863
 864                        ndso->kernel = dso->kernel;
 865
 866                        curr_map = map__new2(pos->start, ndso);
 867                        if (curr_map == NULL) {
 868                                dso__put(ndso);
 869                                return -1;
 870                        }
 871
 872                        curr_map->map_ip = curr_map->unmap_ip = identity__map_ip;
 873                        maps__insert(kmaps, curr_map);
 874                        ++kernel_range;
 875                } else if (delta) {
 876                        /* Kernel was relocated at boot time */
 877                        pos->start -= delta;
 878                        pos->end -= delta;
 879                }
 880add_symbol:
 881                if (curr_map != initial_map) {
 882                        rb_erase_cached(&pos->rb_node, root);
 883                        symbols__insert(&curr_map->dso->symbols, pos);
 884                        ++moved;
 885                } else
 886                        ++count;
 887
 888                continue;
 889discard_symbol:
 890                rb_erase_cached(&pos->rb_node, root);
 891                symbol__delete(pos);
 892        }
 893
 894        if (curr_map != initial_map &&
 895            dso->kernel == DSO_TYPE_GUEST_KERNEL &&
 896            machine__is_default_guest(kmaps->machine)) {
 897                dso__set_loaded(curr_map->dso);
 898        }
 899
 900        return count + moved;
 901}
 902
 903bool symbol__restricted_filename(const char *filename,
 904                                 const char *restricted_filename)
 905{
 906        bool restricted = false;
 907
 908        if (symbol_conf.kptr_restrict) {
 909                char *r = realpath(filename, NULL);
 910
 911                if (r != NULL) {
 912                        restricted = strcmp(r, restricted_filename) == 0;
 913                        free(r);
 914                        return restricted;
 915                }
 916        }
 917
 918        return restricted;
 919}
 920
 921struct module_info {
 922        struct rb_node rb_node;
 923        char *name;
 924        u64 start;
 925};
 926
 927static void add_module(struct module_info *mi, struct rb_root *modules)
 928{
 929        struct rb_node **p = &modules->rb_node;
 930        struct rb_node *parent = NULL;
 931        struct module_info *m;
 932
 933        while (*p != NULL) {
 934                parent = *p;
 935                m = rb_entry(parent, struct module_info, rb_node);
 936                if (strcmp(mi->name, m->name) < 0)
 937                        p = &(*p)->rb_left;
 938                else
 939                        p = &(*p)->rb_right;
 940        }
 941        rb_link_node(&mi->rb_node, parent, p);
 942        rb_insert_color(&mi->rb_node, modules);
 943}
 944
 945static void delete_modules(struct rb_root *modules)
 946{
 947        struct module_info *mi;
 948        struct rb_node *next = rb_first(modules);
 949
 950        while (next) {
 951                mi = rb_entry(next, struct module_info, rb_node);
 952                next = rb_next(&mi->rb_node);
 953                rb_erase(&mi->rb_node, modules);
 954                zfree(&mi->name);
 955                free(mi);
 956        }
 957}
 958
 959static struct module_info *find_module(const char *name,
 960                                       struct rb_root *modules)
 961{
 962        struct rb_node *n = modules->rb_node;
 963
 964        while (n) {
 965                struct module_info *m;
 966                int cmp;
 967
 968                m = rb_entry(n, struct module_info, rb_node);
 969                cmp = strcmp(name, m->name);
 970                if (cmp < 0)
 971                        n = n->rb_left;
 972                else if (cmp > 0)
 973                        n = n->rb_right;
 974                else
 975                        return m;
 976        }
 977
 978        return NULL;
 979}
 980
 981static int __read_proc_modules(void *arg, const char *name, u64 start,
 982                               u64 size __maybe_unused)
 983{
 984        struct rb_root *modules = arg;
 985        struct module_info *mi;
 986
 987        mi = zalloc(sizeof(struct module_info));
 988        if (!mi)
 989                return -ENOMEM;
 990
 991        mi->name = strdup(name);
 992        mi->start = start;
 993
 994        if (!mi->name) {
 995                free(mi);
 996                return -ENOMEM;
 997        }
 998
 999        add_module(mi, modules);
1000
1001        return 0;
1002}
1003
1004static int read_proc_modules(const char *filename, struct rb_root *modules)
1005{
1006        if (symbol__restricted_filename(filename, "/proc/modules"))
1007                return -1;
1008
1009        if (modules__parse(filename, modules, __read_proc_modules)) {
1010                delete_modules(modules);
1011                return -1;
1012        }
1013
1014        return 0;
1015}
1016
1017int compare_proc_modules(const char *from, const char *to)
1018{
1019        struct rb_root from_modules = RB_ROOT;
1020        struct rb_root to_modules = RB_ROOT;
1021        struct rb_node *from_node, *to_node;
1022        struct module_info *from_m, *to_m;
1023        int ret = -1;
1024
1025        if (read_proc_modules(from, &from_modules))
1026                return -1;
1027
1028        if (read_proc_modules(to, &to_modules))
1029                goto out_delete_from;
1030
1031        from_node = rb_first(&from_modules);
1032        to_node = rb_first(&to_modules);
1033        while (from_node) {
1034                if (!to_node)
1035                        break;
1036
1037                from_m = rb_entry(from_node, struct module_info, rb_node);
1038                to_m = rb_entry(to_node, struct module_info, rb_node);
1039
1040                if (from_m->start != to_m->start ||
1041                    strcmp(from_m->name, to_m->name))
1042                        break;
1043
1044                from_node = rb_next(from_node);
1045                to_node = rb_next(to_node);
1046        }
1047
1048        if (!from_node && !to_node)
1049                ret = 0;
1050
1051        delete_modules(&to_modules);
1052out_delete_from:
1053        delete_modules(&from_modules);
1054
1055        return ret;
1056}
1057
1058static int do_validate_kcore_modules(const char *filename, struct maps *kmaps)
1059{
1060        struct rb_root modules = RB_ROOT;
1061        struct map *old_map;
1062        int err;
1063
1064        err = read_proc_modules(filename, &modules);
1065        if (err)
1066                return err;
1067
1068        maps__for_each_entry(kmaps, old_map) {
1069                struct module_info *mi;
1070
1071                if (!__map__is_kmodule(old_map)) {
1072                        continue;
1073                }
1074
1075                /* Module must be in memory at the same address */
1076                mi = find_module(old_map->dso->short_name, &modules);
1077                if (!mi || mi->start != old_map->start) {
1078                        err = -EINVAL;
1079                        goto out;
1080                }
1081        }
1082out:
1083        delete_modules(&modules);
1084        return err;
1085}
1086
1087/*
1088 * If kallsyms is referenced by name then we look for filename in the same
1089 * directory.
1090 */
1091static bool filename_from_kallsyms_filename(char *filename,
1092                                            const char *base_name,
1093                                            const char *kallsyms_filename)
1094{
1095        char *name;
1096
1097        strcpy(filename, kallsyms_filename);
1098        name = strrchr(filename, '/');
1099        if (!name)
1100                return false;
1101
1102        name += 1;
1103
1104        if (!strcmp(name, "kallsyms")) {
1105                strcpy(name, base_name);
1106                return true;
1107        }
1108
1109        return false;
1110}
1111
1112static int validate_kcore_modules(const char *kallsyms_filename,
1113                                  struct map *map)
1114{
1115        struct maps *kmaps = map__kmaps(map);
1116        char modules_filename[PATH_MAX];
1117
1118        if (!kmaps)
1119                return -EINVAL;
1120
1121        if (!filename_from_kallsyms_filename(modules_filename, "modules",
1122                                             kallsyms_filename))
1123                return -EINVAL;
1124
1125        if (do_validate_kcore_modules(modules_filename, kmaps))
1126                return -EINVAL;
1127
1128        return 0;
1129}
1130
1131static int validate_kcore_addresses(const char *kallsyms_filename,
1132                                    struct map *map)
1133{
1134        struct kmap *kmap = map__kmap(map);
1135
1136        if (!kmap)
1137                return -EINVAL;
1138
1139        if (kmap->ref_reloc_sym && kmap->ref_reloc_sym->name) {
1140                u64 start;
1141
1142                if (kallsyms__get_function_start(kallsyms_filename,
1143                                                 kmap->ref_reloc_sym->name, &start))
1144                        return -ENOENT;
1145                if (start != kmap->ref_reloc_sym->addr)
1146                        return -EINVAL;
1147        }
1148
1149        return validate_kcore_modules(kallsyms_filename, map);
1150}
1151
1152struct kcore_mapfn_data {
1153        struct dso *dso;
1154        struct list_head maps;
1155};
1156
1157static int kcore_mapfn(u64 start, u64 len, u64 pgoff, void *data)
1158{
1159        struct kcore_mapfn_data *md = data;
1160        struct map *map;
1161
1162        map = map__new2(start, md->dso);
1163        if (map == NULL)
1164                return -ENOMEM;
1165
1166        map->end = map->start + len;
1167        map->pgoff = pgoff;
1168
1169        list_add(&map->node, &md->maps);
1170
1171        return 0;
1172}
1173
1174/*
1175 * Merges map into maps by splitting the new map within the existing map
1176 * regions.
1177 */
1178int maps__merge_in(struct maps *kmaps, struct map *new_map)
1179{
1180        struct map *old_map;
1181        LIST_HEAD(merged);
1182
1183        maps__for_each_entry(kmaps, old_map) {
1184                /* no overload with this one */
1185                if (new_map->end < old_map->start ||
1186                    new_map->start >= old_map->end)
1187                        continue;
1188
1189                if (new_map->start < old_map->start) {
1190                        /*
1191                         * |new......
1192                         *       |old....
1193                         */
1194                        if (new_map->end < old_map->end) {
1195                                /*
1196                                 * |new......|     -> |new..|
1197                                 *       |old....| ->       |old....|
1198                                 */
1199                                new_map->end = old_map->start;
1200                        } else {
1201                                /*
1202                                 * |new.............| -> |new..|       |new..|
1203                                 *       |old....|    ->       |old....|
1204                                 */
1205                                struct map *m = map__clone(new_map);
1206
1207                                if (!m)
1208                                        return -ENOMEM;
1209
1210                                m->end = old_map->start;
1211                                list_add_tail(&m->node, &merged);
1212                                new_map->start = old_map->end;
1213                        }
1214                } else {
1215                        /*
1216                         *      |new......
1217                         * |old....
1218                         */
1219                        if (new_map->end < old_map->end) {
1220                                /*
1221                                 *      |new..|   -> x
1222                                 * |old.........| -> |old.........|
1223                                 */
1224                                map__put(new_map);
1225                                new_map = NULL;
1226                                break;
1227                        } else {
1228                                /*
1229                                 *      |new......| ->         |new...|
1230                                 * |old....|        -> |old....|
1231                                 */
1232                                new_map->start = old_map->end;
1233                        }
1234                }
1235        }
1236
1237        while (!list_empty(&merged)) {
1238                old_map = list_entry(merged.next, struct map, node);
1239                list_del_init(&old_map->node);
1240                maps__insert(kmaps, old_map);
1241                map__put(old_map);
1242        }
1243
1244        if (new_map) {
1245                maps__insert(kmaps, new_map);
1246                map__put(new_map);
1247        }
1248        return 0;
1249}
1250
1251static int dso__load_kcore(struct dso *dso, struct map *map,
1252                           const char *kallsyms_filename)
1253{
1254        struct maps *kmaps = map__kmaps(map);
1255        struct kcore_mapfn_data md;
1256        struct map *old_map, *new_map, *replacement_map = NULL, *next;
1257        struct machine *machine;
1258        bool is_64_bit;
1259        int err, fd;
1260        char kcore_filename[PATH_MAX];
1261        u64 stext;
1262
1263        if (!kmaps)
1264                return -EINVAL;
1265
1266        machine = kmaps->machine;
1267
1268        /* This function requires that the map is the kernel map */
1269        if (!__map__is_kernel(map))
1270                return -EINVAL;
1271
1272        if (!filename_from_kallsyms_filename(kcore_filename, "kcore",
1273                                             kallsyms_filename))
1274                return -EINVAL;
1275
1276        /* Modules and kernel must be present at their original addresses */
1277        if (validate_kcore_addresses(kallsyms_filename, map))
1278                return -EINVAL;
1279
1280        md.dso = dso;
1281        INIT_LIST_HEAD(&md.maps);
1282
1283        fd = open(kcore_filename, O_RDONLY);
1284        if (fd < 0) {
1285                pr_debug("Failed to open %s. Note /proc/kcore requires CAP_SYS_RAWIO capability to access.\n",
1286                         kcore_filename);
1287                return -EINVAL;
1288        }
1289
1290        /* Read new maps into temporary lists */
1291        err = file__read_maps(fd, map->prot & PROT_EXEC, kcore_mapfn, &md,
1292                              &is_64_bit);
1293        if (err)
1294                goto out_err;
1295        dso->is_64_bit = is_64_bit;
1296
1297        if (list_empty(&md.maps)) {
1298                err = -EINVAL;
1299                goto out_err;
1300        }
1301
1302        /* Remove old maps */
1303        maps__for_each_entry_safe(kmaps, old_map, next) {
1304                /*
1305                 * We need to preserve eBPF maps even if they are
1306                 * covered by kcore, because we need to access
1307                 * eBPF dso for source data.
1308                 */
1309                if (old_map != map && !__map__is_bpf_prog(old_map))
1310                        maps__remove(kmaps, old_map);
1311        }
1312        machine->trampolines_mapped = false;
1313
1314        /* Find the kernel map using the '_stext' symbol */
1315        if (!kallsyms__get_function_start(kallsyms_filename, "_stext", &stext)) {
1316                list_for_each_entry(new_map, &md.maps, node) {
1317                        if (stext >= new_map->start && stext < new_map->end) {
1318                                replacement_map = new_map;
1319                                break;
1320                        }
1321                }
1322        }
1323
1324        if (!replacement_map)
1325                replacement_map = list_entry(md.maps.next, struct map, node);
1326
1327        /* Add new maps */
1328        while (!list_empty(&md.maps)) {
1329                new_map = list_entry(md.maps.next, struct map, node);
1330                list_del_init(&new_map->node);
1331                if (new_map == replacement_map) {
1332                        map->start      = new_map->start;
1333                        map->end        = new_map->end;
1334                        map->pgoff      = new_map->pgoff;
1335                        map->map_ip     = new_map->map_ip;
1336                        map->unmap_ip   = new_map->unmap_ip;
1337                        /* Ensure maps are correctly ordered */
1338                        map__get(map);
1339                        maps__remove(kmaps, map);
1340                        maps__insert(kmaps, map);
1341                        map__put(map);
1342                        map__put(new_map);
1343                } else {
1344                        /*
1345                         * Merge kcore map into existing maps,
1346                         * and ensure that current maps (eBPF)
1347                         * stay intact.
1348                         */
1349                        if (maps__merge_in(kmaps, new_map))
1350                                goto out_err;
1351                }
1352        }
1353
1354        if (machine__is(machine, "x86_64")) {
1355                u64 addr;
1356
1357                /*
1358                 * If one of the corresponding symbols is there, assume the
1359                 * entry trampoline maps are too.
1360                 */
1361                if (!kallsyms__get_function_start(kallsyms_filename,
1362                                                  ENTRY_TRAMPOLINE_NAME,
1363                                                  &addr))
1364                        machine->trampolines_mapped = true;
1365        }
1366
1367        /*
1368         * Set the data type and long name so that kcore can be read via
1369         * dso__data_read_addr().
1370         */
1371        if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
1372                dso->binary_type = DSO_BINARY_TYPE__GUEST_KCORE;
1373        else
1374                dso->binary_type = DSO_BINARY_TYPE__KCORE;
1375        dso__set_long_name(dso, strdup(kcore_filename), true);
1376
1377        close(fd);
1378
1379        if (map->prot & PROT_EXEC)
1380                pr_debug("Using %s for kernel object code\n", kcore_filename);
1381        else
1382                pr_debug("Using %s for kernel data\n", kcore_filename);
1383
1384        return 0;
1385
1386out_err:
1387        while (!list_empty(&md.maps)) {
1388                map = list_entry(md.maps.next, struct map, node);
1389                list_del_init(&map->node);
1390                map__put(map);
1391        }
1392        close(fd);
1393        return -EINVAL;
1394}
1395
1396/*
1397 * If the kernel is relocated at boot time, kallsyms won't match.  Compute the
1398 * delta based on the relocation reference symbol.
1399 */
1400static int kallsyms__delta(struct kmap *kmap, const char *filename, u64 *delta)
1401{
1402        u64 addr;
1403
1404        if (!kmap->ref_reloc_sym || !kmap->ref_reloc_sym->name)
1405                return 0;
1406
1407        if (kallsyms__get_function_start(filename, kmap->ref_reloc_sym->name, &addr))
1408                return -1;
1409
1410        *delta = addr - kmap->ref_reloc_sym->addr;
1411        return 0;
1412}
1413
1414int __dso__load_kallsyms(struct dso *dso, const char *filename,
1415                         struct map *map, bool no_kcore)
1416{
1417        struct kmap *kmap = map__kmap(map);
1418        u64 delta = 0;
1419
1420        if (symbol__restricted_filename(filename, "/proc/kallsyms"))
1421                return -1;
1422
1423        if (!kmap || !kmap->kmaps)
1424                return -1;
1425
1426        if (dso__load_all_kallsyms(dso, filename) < 0)
1427                return -1;
1428
1429        if (kallsyms__delta(kmap, filename, &delta))
1430                return -1;
1431
1432        symbols__fixup_end(&dso->symbols);
1433        symbols__fixup_duplicate(&dso->symbols);
1434
1435        if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
1436                dso->symtab_type = DSO_BINARY_TYPE__GUEST_KALLSYMS;
1437        else
1438                dso->symtab_type = DSO_BINARY_TYPE__KALLSYMS;
1439
1440        if (!no_kcore && !dso__load_kcore(dso, map, filename))
1441                return maps__split_kallsyms_for_kcore(kmap->kmaps, dso);
1442        else
1443                return maps__split_kallsyms(kmap->kmaps, dso, delta, map);
1444}
1445
1446int dso__load_kallsyms(struct dso *dso, const char *filename,
1447                       struct map *map)
1448{
1449        return __dso__load_kallsyms(dso, filename, map, false);
1450}
1451
1452static int dso__load_perf_map(const char *map_path, struct dso *dso)
1453{
1454        char *line = NULL;
1455        size_t n;
1456        FILE *file;
1457        int nr_syms = 0;
1458
1459        file = fopen(map_path, "r");
1460        if (file == NULL)
1461                goto out_failure;
1462
1463        while (!feof(file)) {
1464                u64 start, size;
1465                struct symbol *sym;
1466                int line_len, len;
1467
1468                line_len = getline(&line, &n, file);
1469                if (line_len < 0)
1470                        break;
1471
1472                if (!line)
1473                        goto out_failure;
1474
1475                line[--line_len] = '\0'; /* \n */
1476
1477                len = hex2u64(line, &start);
1478
1479                len++;
1480                if (len + 2 >= line_len)
1481                        continue;
1482
1483                len += hex2u64(line + len, &size);
1484
1485                len++;
1486                if (len + 2 >= line_len)
1487                        continue;
1488
1489                sym = symbol__new(start, size, STB_GLOBAL, STT_FUNC, line + len);
1490
1491                if (sym == NULL)
1492                        goto out_delete_line;
1493
1494                symbols__insert(&dso->symbols, sym);
1495                nr_syms++;
1496        }
1497
1498        free(line);
1499        fclose(file);
1500
1501        return nr_syms;
1502
1503out_delete_line:
1504        free(line);
1505out_failure:
1506        return -1;
1507}
1508
1509static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod,
1510                                           enum dso_binary_type type)
1511{
1512        switch (type) {
1513        case DSO_BINARY_TYPE__JAVA_JIT:
1514        case DSO_BINARY_TYPE__DEBUGLINK:
1515        case DSO_BINARY_TYPE__SYSTEM_PATH_DSO:
1516        case DSO_BINARY_TYPE__FEDORA_DEBUGINFO:
1517        case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO:
1518        case DSO_BINARY_TYPE__BUILDID_DEBUGINFO:
1519        case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO:
1520                return !kmod && dso->kernel == DSO_TYPE_USER;
1521
1522        case DSO_BINARY_TYPE__KALLSYMS:
1523        case DSO_BINARY_TYPE__VMLINUX:
1524        case DSO_BINARY_TYPE__KCORE:
1525                return dso->kernel == DSO_TYPE_KERNEL;
1526
1527        case DSO_BINARY_TYPE__GUEST_KALLSYMS:
1528        case DSO_BINARY_TYPE__GUEST_VMLINUX:
1529        case DSO_BINARY_TYPE__GUEST_KCORE:
1530                return dso->kernel == DSO_TYPE_GUEST_KERNEL;
1531
1532        case DSO_BINARY_TYPE__GUEST_KMODULE:
1533        case DSO_BINARY_TYPE__GUEST_KMODULE_COMP:
1534        case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE:
1535        case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP:
1536                /*
1537                 * kernel modules know their symtab type - it's set when
1538                 * creating a module dso in machine__addnew_module_map().
1539                 */
1540                return kmod && dso->symtab_type == type;
1541
1542        case DSO_BINARY_TYPE__BUILD_ID_CACHE:
1543        case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO:
1544                return true;
1545
1546        case DSO_BINARY_TYPE__BPF_PROG_INFO:
1547        case DSO_BINARY_TYPE__NOT_FOUND:
1548        default:
1549                return false;
1550        }
1551}
1552
1553/* Checks for the existence of the perf-<pid>.map file in two different
1554 * locations.  First, if the process is a separate mount namespace, check in
1555 * that namespace using the pid of the innermost pid namespace.  If's not in a
1556 * namespace, or the file can't be found there, try in the mount namespace of
1557 * the tracing process using our view of its pid.
1558 */
1559static int dso__find_perf_map(char *filebuf, size_t bufsz,
1560                              struct nsinfo **nsip)
1561{
1562        struct nscookie nsc;
1563        struct nsinfo *nsi;
1564        struct nsinfo *nnsi;
1565        int rc = -1;
1566
1567        nsi = *nsip;
1568
1569        if (nsi->need_setns) {
1570                snprintf(filebuf, bufsz, "/tmp/perf-%d.map", nsi->nstgid);
1571                nsinfo__mountns_enter(nsi, &nsc);
1572                rc = access(filebuf, R_OK);
1573                nsinfo__mountns_exit(&nsc);
1574                if (rc == 0)
1575                        return rc;
1576        }
1577
1578        nnsi = nsinfo__copy(nsi);
1579        if (nnsi) {
1580                nsinfo__put(nsi);
1581
1582                nnsi->need_setns = false;
1583                snprintf(filebuf, bufsz, "/tmp/perf-%d.map", nnsi->tgid);
1584                *nsip = nnsi;
1585                rc = 0;
1586        }
1587
1588        return rc;
1589}
1590
1591int dso__load(struct dso *dso, struct map *map)
1592{
1593        char *name;
1594        int ret = -1;
1595        u_int i;
1596        struct machine *machine = NULL;
1597        char *root_dir = (char *) "";
1598        int ss_pos = 0;
1599        struct symsrc ss_[2];
1600        struct symsrc *syms_ss = NULL, *runtime_ss = NULL;
1601        bool kmod;
1602        bool perfmap;
1603        unsigned char build_id[BUILD_ID_SIZE];
1604        struct nscookie nsc;
1605        char newmapname[PATH_MAX];
1606        const char *map_path = dso->long_name;
1607
1608        perfmap = strncmp(dso->name, "/tmp/perf-", 10) == 0;
1609        if (perfmap) {
1610                if (dso->nsinfo && (dso__find_perf_map(newmapname,
1611                    sizeof(newmapname), &dso->nsinfo) == 0)) {
1612                        map_path = newmapname;
1613                }
1614        }
1615
1616        nsinfo__mountns_enter(dso->nsinfo, &nsc);
1617        pthread_mutex_lock(&dso->lock);
1618
1619        /* check again under the dso->lock */
1620        if (dso__loaded(dso)) {
1621                ret = 1;
1622                goto out;
1623        }
1624
1625        kmod = dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE ||
1626                dso->symtab_type == DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP ||
1627                dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE ||
1628                dso->symtab_type == DSO_BINARY_TYPE__GUEST_KMODULE_COMP;
1629
1630        if (dso->kernel && !kmod) {
1631                if (dso->kernel == DSO_TYPE_KERNEL)
1632                        ret = dso__load_kernel_sym(dso, map);
1633                else if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
1634                        ret = dso__load_guest_kernel_sym(dso, map);
1635
1636                machine = map__kmaps(map)->machine;
1637                if (machine__is(machine, "x86_64"))
1638                        machine__map_x86_64_entry_trampolines(machine, dso);
1639                goto out;
1640        }
1641
1642        dso->adjust_symbols = 0;
1643
1644        if (perfmap) {
1645                ret = dso__load_perf_map(map_path, dso);
1646                dso->symtab_type = ret > 0 ? DSO_BINARY_TYPE__JAVA_JIT :
1647                                             DSO_BINARY_TYPE__NOT_FOUND;
1648                goto out;
1649        }
1650
1651        if (machine)
1652                root_dir = machine->root_dir;
1653
1654        name = malloc(PATH_MAX);
1655        if (!name)
1656                goto out;
1657
1658        /*
1659         * Read the build id if possible. This is required for
1660         * DSO_BINARY_TYPE__BUILDID_DEBUGINFO to work
1661         */
1662        if (!dso->has_build_id &&
1663            is_regular_file(dso->long_name)) {
1664            __symbol__join_symfs(name, PATH_MAX, dso->long_name);
1665            if (filename__read_build_id(name, build_id, BUILD_ID_SIZE) > 0)
1666                dso__set_build_id(dso, build_id);
1667        }
1668
1669        /*
1670         * Iterate over candidate debug images.
1671         * Keep track of "interesting" ones (those which have a symtab, dynsym,
1672         * and/or opd section) for processing.
1673         */
1674        for (i = 0; i < DSO_BINARY_TYPE__SYMTAB_CNT; i++) {
1675                struct symsrc *ss = &ss_[ss_pos];
1676                bool next_slot = false;
1677                bool is_reg;
1678                bool nsexit;
1679                int sirc = -1;
1680
1681                enum dso_binary_type symtab_type = binary_type_symtab[i];
1682
1683                nsexit = (symtab_type == DSO_BINARY_TYPE__BUILD_ID_CACHE ||
1684                    symtab_type == DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO);
1685
1686                if (!dso__is_compatible_symtab_type(dso, kmod, symtab_type))
1687                        continue;
1688
1689                if (dso__read_binary_type_filename(dso, symtab_type,
1690                                                   root_dir, name, PATH_MAX))
1691                        continue;
1692
1693                if (nsexit)
1694                        nsinfo__mountns_exit(&nsc);
1695
1696                is_reg = is_regular_file(name);
1697                if (is_reg)
1698                        sirc = symsrc__init(ss, dso, name, symtab_type);
1699
1700                if (nsexit)
1701                        nsinfo__mountns_enter(dso->nsinfo, &nsc);
1702
1703                if (!is_reg || sirc < 0)
1704                        continue;
1705
1706                if (!syms_ss && symsrc__has_symtab(ss)) {
1707                        syms_ss = ss;
1708                        next_slot = true;
1709                        if (!dso->symsrc_filename)
1710                                dso->symsrc_filename = strdup(name);
1711                }
1712
1713                if (!runtime_ss && symsrc__possibly_runtime(ss)) {
1714                        runtime_ss = ss;
1715                        next_slot = true;
1716                }
1717
1718                if (next_slot) {
1719                        ss_pos++;
1720
1721                        if (syms_ss && runtime_ss)
1722                                break;
1723                } else {
1724                        symsrc__destroy(ss);
1725                }
1726
1727        }
1728
1729        if (!runtime_ss && !syms_ss)
1730                goto out_free;
1731
1732        if (runtime_ss && !syms_ss) {
1733                syms_ss = runtime_ss;
1734        }
1735
1736        /* We'll have to hope for the best */
1737        if (!runtime_ss && syms_ss)
1738                runtime_ss = syms_ss;
1739
1740        if (syms_ss)
1741                ret = dso__load_sym(dso, map, syms_ss, runtime_ss, kmod);
1742        else
1743                ret = -1;
1744
1745        if (ret > 0) {
1746                int nr_plt;
1747
1748                nr_plt = dso__synthesize_plt_symbols(dso, runtime_ss);
1749                if (nr_plt > 0)
1750                        ret += nr_plt;
1751        }
1752
1753        for (; ss_pos > 0; ss_pos--)
1754                symsrc__destroy(&ss_[ss_pos - 1]);
1755out_free:
1756        free(name);
1757        if (ret < 0 && strstr(dso->name, " (deleted)") != NULL)
1758                ret = 0;
1759out:
1760        dso__set_loaded(dso);
1761        pthread_mutex_unlock(&dso->lock);
1762        nsinfo__mountns_exit(&nsc);
1763
1764        return ret;
1765}
1766
1767static int map__strcmp(const void *a, const void *b)
1768{
1769        const struct map *ma = *(const struct map **)a, *mb = *(const struct map **)b;
1770        return strcmp(ma->dso->short_name, mb->dso->short_name);
1771}
1772
1773static int map__strcmp_name(const void *name, const void *b)
1774{
1775        const struct map *map = *(const struct map **)b;
1776        return strcmp(name, map->dso->short_name);
1777}
1778
1779void __maps__sort_by_name(struct maps *maps)
1780{
1781        qsort(maps->maps_by_name, maps->nr_maps, sizeof(struct map *), map__strcmp);
1782}
1783
1784static int map__groups__sort_by_name_from_rbtree(struct maps *maps)
1785{
1786        struct map *map;
1787        struct map **maps_by_name = realloc(maps->maps_by_name, maps->nr_maps * sizeof(map));
1788        int i = 0;
1789
1790        if (maps_by_name == NULL)
1791                return -1;
1792
1793        maps->maps_by_name = maps_by_name;
1794        maps->nr_maps_allocated = maps->nr_maps;
1795
1796        maps__for_each_entry(maps, map)
1797                maps_by_name[i++] = map;
1798
1799        __maps__sort_by_name(maps);
1800        return 0;
1801}
1802
1803static struct map *__maps__find_by_name(struct maps *maps, const char *name)
1804{
1805        struct map **mapp;
1806
1807        if (maps->maps_by_name == NULL &&
1808            map__groups__sort_by_name_from_rbtree(maps))
1809                return NULL;
1810
1811        mapp = bsearch(name, maps->maps_by_name, maps->nr_maps, sizeof(*mapp), map__strcmp_name);
1812        if (mapp)
1813                return *mapp;
1814        return NULL;
1815}
1816
1817struct map *maps__find_by_name(struct maps *maps, const char *name)
1818{
1819        struct map *map;
1820
1821        down_read(&maps->lock);
1822
1823        if (maps->last_search_by_name && strcmp(maps->last_search_by_name->dso->short_name, name) == 0) {
1824                map = maps->last_search_by_name;
1825                goto out_unlock;
1826        }
1827        /*
1828         * If we have maps->maps_by_name, then the name isn't in the rbtree,
1829         * as maps->maps_by_name mirrors the rbtree when lookups by name are
1830         * made.
1831         */
1832        map = __maps__find_by_name(maps, name);
1833        if (map || maps->maps_by_name != NULL)
1834                goto out_unlock;
1835
1836        /* Fallback to traversing the rbtree... */
1837        maps__for_each_entry(maps, map)
1838                if (strcmp(map->dso->short_name, name) == 0) {
1839                        maps->last_search_by_name = map;
1840                        goto out_unlock;
1841                }
1842
1843        map = NULL;
1844
1845out_unlock:
1846        up_read(&maps->lock);
1847        return map;
1848}
1849
1850int dso__load_vmlinux(struct dso *dso, struct map *map,
1851                      const char *vmlinux, bool vmlinux_allocated)
1852{
1853        int err = -1;
1854        struct symsrc ss;
1855        char symfs_vmlinux[PATH_MAX];
1856        enum dso_binary_type symtab_type;
1857
1858        if (vmlinux[0] == '/')
1859                snprintf(symfs_vmlinux, sizeof(symfs_vmlinux), "%s", vmlinux);
1860        else
1861                symbol__join_symfs(symfs_vmlinux, vmlinux);
1862
1863        if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
1864                symtab_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
1865        else
1866                symtab_type = DSO_BINARY_TYPE__VMLINUX;
1867
1868        if (symsrc__init(&ss, dso, symfs_vmlinux, symtab_type))
1869                return -1;
1870
1871        err = dso__load_sym(dso, map, &ss, &ss, 0);
1872        symsrc__destroy(&ss);
1873
1874        if (err > 0) {
1875                if (dso->kernel == DSO_TYPE_GUEST_KERNEL)
1876                        dso->binary_type = DSO_BINARY_TYPE__GUEST_VMLINUX;
1877                else
1878                        dso->binary_type = DSO_BINARY_TYPE__VMLINUX;
1879                dso__set_long_name(dso, vmlinux, vmlinux_allocated);
1880                dso__set_loaded(dso);
1881                pr_debug("Using %s for symbols\n", symfs_vmlinux);
1882        }
1883
1884        return err;
1885}
1886
1887int dso__load_vmlinux_path(struct dso *dso, struct map *map)
1888{
1889        int i, err = 0;
1890        char *filename = NULL;
1891
1892        pr_debug("Looking at the vmlinux_path (%d entries long)\n",
1893                 vmlinux_path__nr_entries + 1);
1894
1895        for (i = 0; i < vmlinux_path__nr_entries; ++i) {
1896                err = dso__load_vmlinux(dso, map, vmlinux_path[i], false);
1897                if (err > 0)
1898                        goto out;
1899        }
1900
1901        if (!symbol_conf.ignore_vmlinux_buildid)
1902                filename = dso__build_id_filename(dso, NULL, 0, false);
1903        if (filename != NULL) {
1904                err = dso__load_vmlinux(dso, map, filename, true);
1905                if (err > 0)
1906                        goto out;
1907                free(filename);
1908        }
1909out:
1910        return err;
1911}
1912
1913static bool visible_dir_filter(const char *name, struct dirent *d)
1914{
1915        if (d->d_type != DT_DIR)
1916                return false;
1917        return lsdir_no_dot_filter(name, d);
1918}
1919
1920static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz)
1921{
1922        char kallsyms_filename[PATH_MAX];
1923        int ret = -1;
1924        struct strlist *dirs;
1925        struct str_node *nd;
1926
1927        dirs = lsdir(dir, visible_dir_filter);
1928        if (!dirs)
1929                return -1;
1930
1931        strlist__for_each_entry(nd, dirs) {
1932                scnprintf(kallsyms_filename, sizeof(kallsyms_filename),
1933                          "%s/%s/kallsyms", dir, nd->s);
1934                if (!validate_kcore_addresses(kallsyms_filename, map)) {
1935                        strlcpy(dir, kallsyms_filename, dir_sz);
1936                        ret = 0;
1937                        break;
1938                }
1939        }
1940
1941        strlist__delete(dirs);
1942
1943        return ret;
1944}
1945
1946/*
1947 * Use open(O_RDONLY) to check readability directly instead of access(R_OK)
1948 * since access(R_OK) only checks with real UID/GID but open() use effective
1949 * UID/GID and actual capabilities (e.g. /proc/kcore requires CAP_SYS_RAWIO).
1950 */
1951static bool filename__readable(const char *file)
1952{
1953        int fd = open(file, O_RDONLY);
1954        if (fd < 0)
1955                return false;
1956        close(fd);
1957        return true;
1958}
1959
1960static char *dso__find_kallsyms(struct dso *dso, struct map *map)
1961{
1962        u8 host_build_id[BUILD_ID_SIZE];
1963        char sbuild_id[SBUILD_ID_SIZE];
1964        bool is_host = false;
1965        char path[PATH_MAX];
1966
1967        if (!dso->has_build_id) {
1968                /*
1969                 * Last resort, if we don't have a build-id and couldn't find
1970                 * any vmlinux file, try the running kernel kallsyms table.
1971                 */
1972                goto proc_kallsyms;
1973        }
1974
1975        if (sysfs__read_build_id("/sys/kernel/notes", host_build_id,
1976                                 sizeof(host_build_id)) == 0)
1977                is_host = dso__build_id_equal(dso, host_build_id);
1978
1979        /* Try a fast path for /proc/kallsyms if possible */
1980        if (is_host) {
1981                /*
1982                 * Do not check the build-id cache, unless we know we cannot use
1983                 * /proc/kcore or module maps don't match to /proc/kallsyms.
1984                 * To check readability of /proc/kcore, do not use access(R_OK)
1985                 * since /proc/kcore requires CAP_SYS_RAWIO to read and access
1986                 * can't check it.
1987                 */
1988                if (filename__readable("/proc/kcore") &&
1989                    !validate_kcore_addresses("/proc/kallsyms", map))
1990                        goto proc_kallsyms;
1991        }
1992
1993        build_id__sprintf(dso->build_id, sizeof(dso->build_id), sbuild_id);
1994
1995        /* Find kallsyms in build-id cache with kcore */
1996        scnprintf(path, sizeof(path), "%s/%s/%s",
1997                  buildid_dir, DSO__NAME_KCORE, sbuild_id);
1998
1999        if (!find_matching_kcore(map, path, sizeof(path)))
2000                return strdup(path);
2001
2002        /* Use current /proc/kallsyms if possible */
2003        if (is_host) {
2004proc_kallsyms:
2005                return strdup("/proc/kallsyms");
2006        }
2007
2008        /* Finally, find a cache of kallsyms */
2009        if (!build_id_cache__kallsyms_path(sbuild_id, path, sizeof(path))) {
2010                pr_err("No kallsyms or vmlinux with build-id %s was found\n",
2011                       sbuild_id);
2012                return NULL;
2013        }
2014
2015        return strdup(path);
2016}
2017
2018static int dso__load_kernel_sym(struct dso *dso, struct map *map)
2019{
2020        int err;
2021        const char *kallsyms_filename = NULL;
2022        char *kallsyms_allocated_filename = NULL;
2023        /*
2024         * Step 1: if the user specified a kallsyms or vmlinux filename, use
2025         * it and only it, reporting errors to the user if it cannot be used.
2026         *
2027         * For instance, try to analyse an ARM perf.data file _without_ a
2028         * build-id, or if the user specifies the wrong path to the right
2029         * vmlinux file, obviously we can't fallback to another vmlinux (a
2030         * x86_86 one, on the machine where analysis is being performed, say),
2031         * or worse, /proc/kallsyms.
2032         *
2033         * If the specified file _has_ a build-id and there is a build-id
2034         * section in the perf.data file, we will still do the expected
2035         * validation in dso__load_vmlinux and will bail out if they don't
2036         * match.
2037         */
2038        if (symbol_conf.kallsyms_name != NULL) {
2039                kallsyms_filename = symbol_conf.kallsyms_name;
2040                goto do_kallsyms;
2041        }
2042
2043        if (!symbol_conf.ignore_vmlinux && symbol_conf.vmlinux_name != NULL) {
2044                return dso__load_vmlinux(dso, map, symbol_conf.vmlinux_name, false);
2045        }
2046
2047        if (!symbol_conf.ignore_vmlinux && vmlinux_path != NULL) {
2048                err = dso__load_vmlinux_path(dso, map);
2049                if (err > 0)
2050                        return err;
2051        }
2052
2053        /* do not try local files if a symfs was given */
2054        if (symbol_conf.symfs[0] != 0)
2055                return -1;
2056
2057        kallsyms_allocated_filename = dso__find_kallsyms(dso, map);
2058        if (!kallsyms_allocated_filename)
2059                return -1;
2060
2061        kallsyms_filename = kallsyms_allocated_filename;
2062
2063do_kallsyms:
2064        err = dso__load_kallsyms(dso, kallsyms_filename, map);
2065        if (err > 0)
2066                pr_debug("Using %s for symbols\n", kallsyms_filename);
2067        free(kallsyms_allocated_filename);
2068
2069        if (err > 0 && !dso__is_kcore(dso)) {
2070                dso->binary_type = DSO_BINARY_TYPE__KALLSYMS;
2071                dso__set_long_name(dso, DSO__NAME_KALLSYMS, false);
2072                map__fixup_start(map);
2073                map__fixup_end(map);
2074        }
2075
2076        return err;
2077}
2078
2079static int dso__load_guest_kernel_sym(struct dso *dso, struct map *map)
2080{
2081        int err;
2082        const char *kallsyms_filename = NULL;
2083        struct machine *machine = map__kmaps(map)->machine;
2084        char path[PATH_MAX];
2085
2086        if (machine__is_default_guest(machine)) {
2087                /*
2088                 * if the user specified a vmlinux filename, use it and only
2089                 * it, reporting errors to the user if it cannot be used.
2090                 * Or use file guest_kallsyms inputted by user on commandline
2091                 */
2092                if (symbol_conf.default_guest_vmlinux_name != NULL) {
2093                        err = dso__load_vmlinux(dso, map,
2094                                                symbol_conf.default_guest_vmlinux_name,
2095                                                false);
2096                        return err;
2097                }
2098
2099                kallsyms_filename = symbol_conf.default_guest_kallsyms;
2100                if (!kallsyms_filename)
2101                        return -1;
2102        } else {
2103                sprintf(path, "%s/proc/kallsyms", machine->root_dir);
2104                kallsyms_filename = path;
2105        }
2106
2107        err = dso__load_kallsyms(dso, kallsyms_filename, map);
2108        if (err > 0)
2109                pr_debug("Using %s for symbols\n", kallsyms_filename);
2110        if (err > 0 && !dso__is_kcore(dso)) {
2111                dso->binary_type = DSO_BINARY_TYPE__GUEST_KALLSYMS;
2112                dso__set_long_name(dso, machine->mmap_name, false);
2113                map__fixup_start(map);
2114                map__fixup_end(map);
2115        }
2116
2117        return err;
2118}
2119
2120static void vmlinux_path__exit(void)
2121{
2122        while (--vmlinux_path__nr_entries >= 0)
2123                zfree(&vmlinux_path[vmlinux_path__nr_entries]);
2124        vmlinux_path__nr_entries = 0;
2125
2126        zfree(&vmlinux_path);
2127}
2128
2129static const char * const vmlinux_paths[] = {
2130        "vmlinux",
2131        "/boot/vmlinux"
2132};
2133
2134static const char * const vmlinux_paths_upd[] = {
2135        "/boot/vmlinux-%s",
2136        "/usr/lib/debug/boot/vmlinux-%s",
2137        "/lib/modules/%s/build/vmlinux",
2138        "/usr/lib/debug/lib/modules/%s/vmlinux",
2139        "/usr/lib/debug/boot/vmlinux-%s.debug"
2140};
2141
2142static int vmlinux_path__add(const char *new_entry)
2143{
2144        vmlinux_path[vmlinux_path__nr_entries] = strdup(new_entry);
2145        if (vmlinux_path[vmlinux_path__nr_entries] == NULL)
2146                return -1;
2147        ++vmlinux_path__nr_entries;
2148
2149        return 0;
2150}
2151
2152static int vmlinux_path__init(struct perf_env *env)
2153{
2154        struct utsname uts;
2155        char bf[PATH_MAX];
2156        char *kernel_version;
2157        unsigned int i;
2158
2159        vmlinux_path = malloc(sizeof(char *) * (ARRAY_SIZE(vmlinux_paths) +
2160                              ARRAY_SIZE(vmlinux_paths_upd)));
2161        if (vmlinux_path == NULL)
2162                return -1;
2163
2164        for (i = 0; i < ARRAY_SIZE(vmlinux_paths); i++)
2165                if (vmlinux_path__add(vmlinux_paths[i]) < 0)
2166                        goto out_fail;
2167
2168        /* only try kernel version if no symfs was given */
2169        if (symbol_conf.symfs[0] != 0)
2170                return 0;
2171
2172        if (env) {
2173                kernel_version = env->os_release;
2174        } else {
2175                if (uname(&uts) < 0)
2176                        goto out_fail;
2177
2178                kernel_version = uts.release;
2179        }
2180
2181        for (i = 0; i < ARRAY_SIZE(vmlinux_paths_upd); i++) {
2182                snprintf(bf, sizeof(bf), vmlinux_paths_upd[i], kernel_version);
2183                if (vmlinux_path__add(bf) < 0)
2184                        goto out_fail;
2185        }
2186
2187        return 0;
2188
2189out_fail:
2190        vmlinux_path__exit();
2191        return -1;
2192}
2193
2194int setup_list(struct strlist **list, const char *list_str,
2195                      const char *list_name)
2196{
2197        if (list_str == NULL)
2198                return 0;
2199
2200        *list = strlist__new(list_str, NULL);
2201        if (!*list) {
2202                pr_err("problems parsing %s list\n", list_name);
2203                return -1;
2204        }
2205
2206        symbol_conf.has_filter = true;
2207        return 0;
2208}
2209
2210int setup_intlist(struct intlist **list, const char *list_str,
2211                  const char *list_name)
2212{
2213        if (list_str == NULL)
2214                return 0;
2215
2216        *list = intlist__new(list_str);
2217        if (!*list) {
2218                pr_err("problems parsing %s list\n", list_name);
2219                return -1;
2220        }
2221        return 0;
2222}
2223
2224static bool symbol__read_kptr_restrict(void)
2225{
2226        bool value = false;
2227        FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
2228
2229        if (fp != NULL) {
2230                char line[8];
2231
2232                if (fgets(line, sizeof(line), fp) != NULL)
2233                        value = perf_cap__capable(CAP_SYSLOG) ?
2234                                        (atoi(line) >= 2) :
2235                                        (atoi(line) != 0);
2236
2237                fclose(fp);
2238        }
2239
2240        /* Per kernel/kallsyms.c:
2241         * we also restrict when perf_event_paranoid > 1 w/o CAP_SYSLOG
2242         */
2243        if (perf_event_paranoid() > 1 && !perf_cap__capable(CAP_SYSLOG))
2244                value = true;
2245
2246        return value;
2247}
2248
2249int symbol__annotation_init(void)
2250{
2251        if (symbol_conf.init_annotation)
2252                return 0;
2253
2254        if (symbol_conf.initialized) {
2255                pr_err("Annotation needs to be init before symbol__init()\n");
2256                return -1;
2257        }
2258
2259        symbol_conf.priv_size += sizeof(struct annotation);
2260        symbol_conf.init_annotation = true;
2261        return 0;
2262}
2263
2264int symbol__init(struct perf_env *env)
2265{
2266        const char *symfs;
2267
2268        if (symbol_conf.initialized)
2269                return 0;
2270
2271        symbol_conf.priv_size = PERF_ALIGN(symbol_conf.priv_size, sizeof(u64));
2272
2273        symbol__elf_init();
2274
2275        if (symbol_conf.sort_by_name)
2276                symbol_conf.priv_size += (sizeof(struct symbol_name_rb_node) -
2277                                          sizeof(struct symbol));
2278
2279        if (symbol_conf.try_vmlinux_path && vmlinux_path__init(env) < 0)
2280                return -1;
2281
2282        if (symbol_conf.field_sep && *symbol_conf.field_sep == '.') {
2283                pr_err("'.' is the only non valid --field-separator argument\n");
2284                return -1;
2285        }
2286
2287        if (setup_list(&symbol_conf.dso_list,
2288                       symbol_conf.dso_list_str, "dso") < 0)
2289                return -1;
2290
2291        if (setup_list(&symbol_conf.comm_list,
2292                       symbol_conf.comm_list_str, "comm") < 0)
2293                goto out_free_dso_list;
2294
2295        if (setup_intlist(&symbol_conf.pid_list,
2296                       symbol_conf.pid_list_str, "pid") < 0)
2297                goto out_free_comm_list;
2298
2299        if (setup_intlist(&symbol_conf.tid_list,
2300                       symbol_conf.tid_list_str, "tid") < 0)
2301                goto out_free_pid_list;
2302
2303        if (setup_list(&symbol_conf.sym_list,
2304                       symbol_conf.sym_list_str, "symbol") < 0)
2305                goto out_free_tid_list;
2306
2307        if (setup_list(&symbol_conf.bt_stop_list,
2308                       symbol_conf.bt_stop_list_str, "symbol") < 0)
2309                goto out_free_sym_list;
2310
2311        /*
2312         * A path to symbols of "/" is identical to ""
2313         * reset here for simplicity.
2314         */
2315        symfs = realpath(symbol_conf.symfs, NULL);
2316        if (symfs == NULL)
2317                symfs = symbol_conf.symfs;
2318        if (strcmp(symfs, "/") == 0)
2319                symbol_conf.symfs = "";
2320        if (symfs != symbol_conf.symfs)
2321                free((void *)symfs);
2322
2323        symbol_conf.kptr_restrict = symbol__read_kptr_restrict();
2324
2325        symbol_conf.initialized = true;
2326        return 0;
2327
2328out_free_sym_list:
2329        strlist__delete(symbol_conf.sym_list);
2330out_free_tid_list:
2331        intlist__delete(symbol_conf.tid_list);
2332out_free_pid_list:
2333        intlist__delete(symbol_conf.pid_list);
2334out_free_comm_list:
2335        strlist__delete(symbol_conf.comm_list);
2336out_free_dso_list:
2337        strlist__delete(symbol_conf.dso_list);
2338        return -1;
2339}
2340
2341void symbol__exit(void)
2342{
2343        if (!symbol_conf.initialized)
2344                return;
2345        strlist__delete(symbol_conf.bt_stop_list);
2346        strlist__delete(symbol_conf.sym_list);
2347        strlist__delete(symbol_conf.dso_list);
2348        strlist__delete(symbol_conf.comm_list);
2349        intlist__delete(symbol_conf.tid_list);
2350        intlist__delete(symbol_conf.pid_list);
2351        vmlinux_path__exit();
2352        symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list = NULL;
2353        symbol_conf.bt_stop_list = NULL;
2354        symbol_conf.initialized = false;
2355}
2356
2357int symbol__config_symfs(const struct option *opt __maybe_unused,
2358                         const char *dir, int unset __maybe_unused)
2359{
2360        char *bf = NULL;
2361        int ret;
2362
2363        symbol_conf.symfs = strdup(dir);
2364        if (symbol_conf.symfs == NULL)
2365                return -ENOMEM;
2366
2367        /* skip the locally configured cache if a symfs is given, and
2368         * config buildid dir to symfs/.debug
2369         */
2370        ret = asprintf(&bf, "%s/%s", dir, ".debug");
2371        if (ret < 0)
2372                return -ENOMEM;
2373
2374        set_buildid_dir(bf);
2375
2376        free(bf);
2377        return 0;
2378}
2379
2380struct mem_info *mem_info__get(struct mem_info *mi)
2381{
2382        if (mi)
2383                refcount_inc(&mi->refcnt);
2384        return mi;
2385}
2386
2387void mem_info__put(struct mem_info *mi)
2388{
2389        if (mi && refcount_dec_and_test(&mi->refcnt))
2390                free(mi);
2391}
2392
2393struct mem_info *mem_info__new(void)
2394{
2395        struct mem_info *mi = zalloc(sizeof(*mi));
2396
2397        if (mi)
2398                refcount_set(&mi->refcnt, 1);
2399        return mi;
2400}
2401