linux/tools/perf/util/header.c
<<
>>
Prefs
   1#include "util.h"
   2#include <sys/types.h>
   3#include <byteswap.h>
   4#include <unistd.h>
   5#include <stdio.h>
   6#include <stdlib.h>
   7#include <linux/list.h>
   8#include <linux/kernel.h>
   9#include <linux/bitops.h>
  10#include <sys/utsname.h>
  11
  12#include "evlist.h"
  13#include "evsel.h"
  14#include "header.h"
  15#include "../perf.h"
  16#include "trace-event.h"
  17#include "session.h"
  18#include "symbol.h"
  19#include "debug.h"
  20#include "cpumap.h"
  21#include "pmu.h"
  22#include "vdso.h"
  23#include "strbuf.h"
  24#include "build-id.h"
  25#include "data.h"
  26#include <api/fs/fs.h>
  27#include "asm/bug.h"
  28
  29/*
  30 * magic2 = "PERFILE2"
  31 * must be a numerical value to let the endianness
  32 * determine the memory layout. That way we are able
  33 * to detect endianness when reading the perf.data file
  34 * back.
  35 *
  36 * we check for legacy (PERFFILE) format.
  37 */
  38static const char *__perf_magic1 = "PERFFILE";
  39static const u64 __perf_magic2    = 0x32454c4946524550ULL;
  40static const u64 __perf_magic2_sw = 0x50455246494c4532ULL;
  41
  42#define PERF_MAGIC      __perf_magic2
  43
  44struct perf_file_attr {
  45        struct perf_event_attr  attr;
  46        struct perf_file_section        ids;
  47};
  48
  49void perf_header__set_feat(struct perf_header *header, int feat)
  50{
  51        set_bit(feat, header->adds_features);
  52}
  53
  54void perf_header__clear_feat(struct perf_header *header, int feat)
  55{
  56        clear_bit(feat, header->adds_features);
  57}
  58
  59bool perf_header__has_feat(const struct perf_header *header, int feat)
  60{
  61        return test_bit(feat, header->adds_features);
  62}
  63
  64static int do_write(int fd, const void *buf, size_t size)
  65{
  66        while (size) {
  67                int ret = write(fd, buf, size);
  68
  69                if (ret < 0)
  70                        return -errno;
  71
  72                size -= ret;
  73                buf += ret;
  74        }
  75
  76        return 0;
  77}
  78
  79int write_padded(int fd, const void *bf, size_t count, size_t count_aligned)
  80{
  81        static const char zero_buf[NAME_ALIGN];
  82        int err = do_write(fd, bf, count);
  83
  84        if (!err)
  85                err = do_write(fd, zero_buf, count_aligned - count);
  86
  87        return err;
  88}
  89
  90#define string_size(str)                                                \
  91        (PERF_ALIGN((strlen(str) + 1), NAME_ALIGN) + sizeof(u32))
  92
  93static int do_write_string(int fd, const char *str)
  94{
  95        u32 len, olen;
  96        int ret;
  97
  98        olen = strlen(str) + 1;
  99        len = PERF_ALIGN(olen, NAME_ALIGN);
 100
 101        /* write len, incl. \0 */
 102        ret = do_write(fd, &len, sizeof(len));
 103        if (ret < 0)
 104                return ret;
 105
 106        return write_padded(fd, str, olen, len);
 107}
 108
 109static char *do_read_string(int fd, struct perf_header *ph)
 110{
 111        ssize_t sz, ret;
 112        u32 len;
 113        char *buf;
 114
 115        sz = readn(fd, &len, sizeof(len));
 116        if (sz < (ssize_t)sizeof(len))
 117                return NULL;
 118
 119        if (ph->needs_swap)
 120                len = bswap_32(len);
 121
 122        buf = malloc(len);
 123        if (!buf)
 124                return NULL;
 125
 126        ret = readn(fd, buf, len);
 127        if (ret == (ssize_t)len) {
 128                /*
 129                 * strings are padded by zeroes
 130                 * thus the actual strlen of buf
 131                 * may be less than len
 132                 */
 133                return buf;
 134        }
 135
 136        free(buf);
 137        return NULL;
 138}
 139
 140static int write_tracing_data(int fd, struct perf_header *h __maybe_unused,
 141                            struct perf_evlist *evlist)
 142{
 143        return read_tracing_data(fd, &evlist->entries);
 144}
 145
 146
 147static int write_build_id(int fd, struct perf_header *h,
 148                          struct perf_evlist *evlist __maybe_unused)
 149{
 150        struct perf_session *session;
 151        int err;
 152
 153        session = container_of(h, struct perf_session, header);
 154
 155        if (!perf_session__read_build_ids(session, true))
 156                return -1;
 157
 158        err = perf_session__write_buildid_table(session, fd);
 159        if (err < 0) {
 160                pr_debug("failed to write buildid table\n");
 161                return err;
 162        }
 163        perf_session__cache_build_ids(session);
 164
 165        return 0;
 166}
 167
 168static int write_hostname(int fd, struct perf_header *h __maybe_unused,
 169                          struct perf_evlist *evlist __maybe_unused)
 170{
 171        struct utsname uts;
 172        int ret;
 173
 174        ret = uname(&uts);
 175        if (ret < 0)
 176                return -1;
 177
 178        return do_write_string(fd, uts.nodename);
 179}
 180
 181static int write_osrelease(int fd, struct perf_header *h __maybe_unused,
 182                           struct perf_evlist *evlist __maybe_unused)
 183{
 184        struct utsname uts;
 185        int ret;
 186
 187        ret = uname(&uts);
 188        if (ret < 0)
 189                return -1;
 190
 191        return do_write_string(fd, uts.release);
 192}
 193
 194static int write_arch(int fd, struct perf_header *h __maybe_unused,
 195                      struct perf_evlist *evlist __maybe_unused)
 196{
 197        struct utsname uts;
 198        int ret;
 199
 200        ret = uname(&uts);
 201        if (ret < 0)
 202                return -1;
 203
 204        return do_write_string(fd, uts.machine);
 205}
 206
 207static int write_version(int fd, struct perf_header *h __maybe_unused,
 208                         struct perf_evlist *evlist __maybe_unused)
 209{
 210        return do_write_string(fd, perf_version_string);
 211}
 212
 213static int __write_cpudesc(int fd, const char *cpuinfo_proc)
 214{
 215        FILE *file;
 216        char *buf = NULL;
 217        char *s, *p;
 218        const char *search = cpuinfo_proc;
 219        size_t len = 0;
 220        int ret = -1;
 221
 222        if (!search)
 223                return -1;
 224
 225        file = fopen("/proc/cpuinfo", "r");
 226        if (!file)
 227                return -1;
 228
 229        while (getline(&buf, &len, file) > 0) {
 230                ret = strncmp(buf, search, strlen(search));
 231                if (!ret)
 232                        break;
 233        }
 234
 235        if (ret) {
 236                ret = -1;
 237                goto done;
 238        }
 239
 240        s = buf;
 241
 242        p = strchr(buf, ':');
 243        if (p && *(p+1) == ' ' && *(p+2))
 244                s = p + 2;
 245        p = strchr(s, '\n');
 246        if (p)
 247                *p = '\0';
 248
 249        /* squash extra space characters (branding string) */
 250        p = s;
 251        while (*p) {
 252                if (isspace(*p)) {
 253                        char *r = p + 1;
 254                        char *q = r;
 255                        *p = ' ';
 256                        while (*q && isspace(*q))
 257                                q++;
 258                        if (q != (p+1))
 259                                while ((*r++ = *q++));
 260                }
 261                p++;
 262        }
 263        ret = do_write_string(fd, s);
 264done:
 265        free(buf);
 266        fclose(file);
 267        return ret;
 268}
 269
 270static int write_cpudesc(int fd, struct perf_header *h __maybe_unused,
 271                       struct perf_evlist *evlist __maybe_unused)
 272{
 273#ifndef CPUINFO_PROC
 274#define CPUINFO_PROC {"model name", }
 275#endif
 276        const char *cpuinfo_procs[] = CPUINFO_PROC;
 277        unsigned int i;
 278
 279        for (i = 0; i < ARRAY_SIZE(cpuinfo_procs); i++) {
 280                int ret;
 281                ret = __write_cpudesc(fd, cpuinfo_procs[i]);
 282                if (ret >= 0)
 283                        return ret;
 284        }
 285        return -1;
 286}
 287
 288
 289static int write_nrcpus(int fd, struct perf_header *h __maybe_unused,
 290                        struct perf_evlist *evlist __maybe_unused)
 291{
 292        long nr;
 293        u32 nrc, nra;
 294        int ret;
 295
 296        nr = sysconf(_SC_NPROCESSORS_CONF);
 297        if (nr < 0)
 298                return -1;
 299
 300        nrc = (u32)(nr & UINT_MAX);
 301
 302        nr = sysconf(_SC_NPROCESSORS_ONLN);
 303        if (nr < 0)
 304                return -1;
 305
 306        nra = (u32)(nr & UINT_MAX);
 307
 308        ret = do_write(fd, &nrc, sizeof(nrc));
 309        if (ret < 0)
 310                return ret;
 311
 312        return do_write(fd, &nra, sizeof(nra));
 313}
 314
 315static int write_event_desc(int fd, struct perf_header *h __maybe_unused,
 316                            struct perf_evlist *evlist)
 317{
 318        struct perf_evsel *evsel;
 319        u32 nre, nri, sz;
 320        int ret;
 321
 322        nre = evlist->nr_entries;
 323
 324        /*
 325         * write number of events
 326         */
 327        ret = do_write(fd, &nre, sizeof(nre));
 328        if (ret < 0)
 329                return ret;
 330
 331        /*
 332         * size of perf_event_attr struct
 333         */
 334        sz = (u32)sizeof(evsel->attr);
 335        ret = do_write(fd, &sz, sizeof(sz));
 336        if (ret < 0)
 337                return ret;
 338
 339        evlist__for_each_entry(evlist, evsel) {
 340                ret = do_write(fd, &evsel->attr, sz);
 341                if (ret < 0)
 342                        return ret;
 343                /*
 344                 * write number of unique id per event
 345                 * there is one id per instance of an event
 346                 *
 347                 * copy into an nri to be independent of the
 348                 * type of ids,
 349                 */
 350                nri = evsel->ids;
 351                ret = do_write(fd, &nri, sizeof(nri));
 352                if (ret < 0)
 353                        return ret;
 354
 355                /*
 356                 * write event string as passed on cmdline
 357                 */
 358                ret = do_write_string(fd, perf_evsel__name(evsel));
 359                if (ret < 0)
 360                        return ret;
 361                /*
 362                 * write unique ids for this event
 363                 */
 364                ret = do_write(fd, evsel->id, evsel->ids * sizeof(u64));
 365                if (ret < 0)
 366                        return ret;
 367        }
 368        return 0;
 369}
 370
 371static int write_cmdline(int fd, struct perf_header *h __maybe_unused,
 372                         struct perf_evlist *evlist __maybe_unused)
 373{
 374        char buf[MAXPATHLEN];
 375        char proc[32];
 376        u32 n;
 377        int i, ret;
 378
 379        /*
 380         * actual atual path to perf binary
 381         */
 382        sprintf(proc, "/proc/%d/exe", getpid());
 383        ret = readlink(proc, buf, sizeof(buf));
 384        if (ret <= 0)
 385                return -1;
 386
 387        /* readlink() does not add null termination */
 388        buf[ret] = '\0';
 389
 390        /* account for binary path */
 391        n = perf_env.nr_cmdline + 1;
 392
 393        ret = do_write(fd, &n, sizeof(n));
 394        if (ret < 0)
 395                return ret;
 396
 397        ret = do_write_string(fd, buf);
 398        if (ret < 0)
 399                return ret;
 400
 401        for (i = 0 ; i < perf_env.nr_cmdline; i++) {
 402                ret = do_write_string(fd, perf_env.cmdline_argv[i]);
 403                if (ret < 0)
 404                        return ret;
 405        }
 406        return 0;
 407}
 408
 409#define CORE_SIB_FMT \
 410        "/sys/devices/system/cpu/cpu%d/topology/core_siblings_list"
 411#define THRD_SIB_FMT \
 412        "/sys/devices/system/cpu/cpu%d/topology/thread_siblings_list"
 413
 414struct cpu_topo {
 415        u32 cpu_nr;
 416        u32 core_sib;
 417        u32 thread_sib;
 418        char **core_siblings;
 419        char **thread_siblings;
 420};
 421
 422static int build_cpu_topo(struct cpu_topo *tp, int cpu)
 423{
 424        FILE *fp;
 425        char filename[MAXPATHLEN];
 426        char *buf = NULL, *p;
 427        size_t len = 0;
 428        ssize_t sret;
 429        u32 i = 0;
 430        int ret = -1;
 431
 432        sprintf(filename, CORE_SIB_FMT, cpu);
 433        fp = fopen(filename, "r");
 434        if (!fp)
 435                goto try_threads;
 436
 437        sret = getline(&buf, &len, fp);
 438        fclose(fp);
 439        if (sret <= 0)
 440                goto try_threads;
 441
 442        p = strchr(buf, '\n');
 443        if (p)
 444                *p = '\0';
 445
 446        for (i = 0; i < tp->core_sib; i++) {
 447                if (!strcmp(buf, tp->core_siblings[i]))
 448                        break;
 449        }
 450        if (i == tp->core_sib) {
 451                tp->core_siblings[i] = buf;
 452                tp->core_sib++;
 453                buf = NULL;
 454                len = 0;
 455        }
 456        ret = 0;
 457
 458try_threads:
 459        sprintf(filename, THRD_SIB_FMT, cpu);
 460        fp = fopen(filename, "r");
 461        if (!fp)
 462                goto done;
 463
 464        if (getline(&buf, &len, fp) <= 0)
 465                goto done;
 466
 467        p = strchr(buf, '\n');
 468        if (p)
 469                *p = '\0';
 470
 471        for (i = 0; i < tp->thread_sib; i++) {
 472                if (!strcmp(buf, tp->thread_siblings[i]))
 473                        break;
 474        }
 475        if (i == tp->thread_sib) {
 476                tp->thread_siblings[i] = buf;
 477                tp->thread_sib++;
 478                buf = NULL;
 479        }
 480        ret = 0;
 481done:
 482        if(fp)
 483                fclose(fp);
 484        free(buf);
 485        return ret;
 486}
 487
 488static void free_cpu_topo(struct cpu_topo *tp)
 489{
 490        u32 i;
 491
 492        if (!tp)
 493                return;
 494
 495        for (i = 0 ; i < tp->core_sib; i++)
 496                zfree(&tp->core_siblings[i]);
 497
 498        for (i = 0 ; i < tp->thread_sib; i++)
 499                zfree(&tp->thread_siblings[i]);
 500
 501        free(tp);
 502}
 503
 504static struct cpu_topo *build_cpu_topology(void)
 505{
 506        struct cpu_topo *tp;
 507        void *addr;
 508        u32 nr, i;
 509        size_t sz;
 510        long ncpus;
 511        int ret = -1;
 512
 513        ncpus = sysconf(_SC_NPROCESSORS_CONF);
 514        if (ncpus < 0)
 515                return NULL;
 516
 517        nr = (u32)(ncpus & UINT_MAX);
 518
 519        sz = nr * sizeof(char *);
 520
 521        addr = calloc(1, sizeof(*tp) + 2 * sz);
 522        if (!addr)
 523                return NULL;
 524
 525        tp = addr;
 526        tp->cpu_nr = nr;
 527        addr += sizeof(*tp);
 528        tp->core_siblings = addr;
 529        addr += sz;
 530        tp->thread_siblings = addr;
 531
 532        for (i = 0; i < nr; i++) {
 533                ret = build_cpu_topo(tp, i);
 534                if (ret < 0)
 535                        break;
 536        }
 537        if (ret) {
 538                free_cpu_topo(tp);
 539                tp = NULL;
 540        }
 541        return tp;
 542}
 543
 544static int write_cpu_topology(int fd, struct perf_header *h __maybe_unused,
 545                          struct perf_evlist *evlist __maybe_unused)
 546{
 547        struct cpu_topo *tp;
 548        u32 i;
 549        int ret, j;
 550
 551        tp = build_cpu_topology();
 552        if (!tp)
 553                return -1;
 554
 555        ret = do_write(fd, &tp->core_sib, sizeof(tp->core_sib));
 556        if (ret < 0)
 557                goto done;
 558
 559        for (i = 0; i < tp->core_sib; i++) {
 560                ret = do_write_string(fd, tp->core_siblings[i]);
 561                if (ret < 0)
 562                        goto done;
 563        }
 564        ret = do_write(fd, &tp->thread_sib, sizeof(tp->thread_sib));
 565        if (ret < 0)
 566                goto done;
 567
 568        for (i = 0; i < tp->thread_sib; i++) {
 569                ret = do_write_string(fd, tp->thread_siblings[i]);
 570                if (ret < 0)
 571                        break;
 572        }
 573
 574        ret = perf_env__read_cpu_topology_map(&perf_env);
 575        if (ret < 0)
 576                goto done;
 577
 578        for (j = 0; j < perf_env.nr_cpus_avail; j++) {
 579                ret = do_write(fd, &perf_env.cpu[j].core_id,
 580                               sizeof(perf_env.cpu[j].core_id));
 581                if (ret < 0)
 582                        return ret;
 583                ret = do_write(fd, &perf_env.cpu[j].socket_id,
 584                               sizeof(perf_env.cpu[j].socket_id));
 585                if (ret < 0)
 586                        return ret;
 587        }
 588done:
 589        free_cpu_topo(tp);
 590        return ret;
 591}
 592
 593
 594
 595static int write_total_mem(int fd, struct perf_header *h __maybe_unused,
 596                          struct perf_evlist *evlist __maybe_unused)
 597{
 598        char *buf = NULL;
 599        FILE *fp;
 600        size_t len = 0;
 601        int ret = -1, n;
 602        uint64_t mem;
 603
 604        fp = fopen("/proc/meminfo", "r");
 605        if (!fp)
 606                return -1;
 607
 608        while (getline(&buf, &len, fp) > 0) {
 609                ret = strncmp(buf, "MemTotal:", 9);
 610                if (!ret)
 611                        break;
 612        }
 613        if (!ret) {
 614                n = sscanf(buf, "%*s %"PRIu64, &mem);
 615                if (n == 1)
 616                        ret = do_write(fd, &mem, sizeof(mem));
 617        } else
 618                ret = -1;
 619        free(buf);
 620        fclose(fp);
 621        return ret;
 622}
 623
 624static int write_topo_node(int fd, int node)
 625{
 626        char str[MAXPATHLEN];
 627        char field[32];
 628        char *buf = NULL, *p;
 629        size_t len = 0;
 630        FILE *fp;
 631        u64 mem_total, mem_free, mem;
 632        int ret = -1;
 633
 634        sprintf(str, "/sys/devices/system/node/node%d/meminfo", node);
 635        fp = fopen(str, "r");
 636        if (!fp)
 637                return -1;
 638
 639        while (getline(&buf, &len, fp) > 0) {
 640                /* skip over invalid lines */
 641                if (!strchr(buf, ':'))
 642                        continue;
 643                if (sscanf(buf, "%*s %*d %31s %"PRIu64, field, &mem) != 2)
 644                        goto done;
 645                if (!strcmp(field, "MemTotal:"))
 646                        mem_total = mem;
 647                if (!strcmp(field, "MemFree:"))
 648                        mem_free = mem;
 649        }
 650
 651        fclose(fp);
 652        fp = NULL;
 653
 654        ret = do_write(fd, &mem_total, sizeof(u64));
 655        if (ret)
 656                goto done;
 657
 658        ret = do_write(fd, &mem_free, sizeof(u64));
 659        if (ret)
 660                goto done;
 661
 662        ret = -1;
 663        sprintf(str, "/sys/devices/system/node/node%d/cpulist", node);
 664
 665        fp = fopen(str, "r");
 666        if (!fp)
 667                goto done;
 668
 669        if (getline(&buf, &len, fp) <= 0)
 670                goto done;
 671
 672        p = strchr(buf, '\n');
 673        if (p)
 674                *p = '\0';
 675
 676        ret = do_write_string(fd, buf);
 677done:
 678        free(buf);
 679        if (fp)
 680                fclose(fp);
 681        return ret;
 682}
 683
 684static int write_numa_topology(int fd, struct perf_header *h __maybe_unused,
 685                          struct perf_evlist *evlist __maybe_unused)
 686{
 687        char *buf = NULL;
 688        size_t len = 0;
 689        FILE *fp;
 690        struct cpu_map *node_map = NULL;
 691        char *c;
 692        u32 nr, i, j;
 693        int ret = -1;
 694
 695        fp = fopen("/sys/devices/system/node/online", "r");
 696        if (!fp)
 697                return -1;
 698
 699        if (getline(&buf, &len, fp) <= 0)
 700                goto done;
 701
 702        c = strchr(buf, '\n');
 703        if (c)
 704                *c = '\0';
 705
 706        node_map = cpu_map__new(buf);
 707        if (!node_map)
 708                goto done;
 709
 710        nr = (u32)node_map->nr;
 711
 712        ret = do_write(fd, &nr, sizeof(nr));
 713        if (ret < 0)
 714                goto done;
 715
 716        for (i = 0; i < nr; i++) {
 717                j = (u32)node_map->map[i];
 718                ret = do_write(fd, &j, sizeof(j));
 719                if (ret < 0)
 720                        break;
 721
 722                ret = write_topo_node(fd, i);
 723                if (ret < 0)
 724                        break;
 725        }
 726done:
 727        free(buf);
 728        fclose(fp);
 729        cpu_map__put(node_map);
 730        return ret;
 731}
 732
 733/*
 734 * File format:
 735 *
 736 * struct pmu_mappings {
 737 *      u32     pmu_num;
 738 *      struct pmu_map {
 739 *              u32     type;
 740 *              char    name[];
 741 *      }[pmu_num];
 742 * };
 743 */
 744
 745static int write_pmu_mappings(int fd, struct perf_header *h __maybe_unused,
 746                              struct perf_evlist *evlist __maybe_unused)
 747{
 748        struct perf_pmu *pmu = NULL;
 749        off_t offset = lseek(fd, 0, SEEK_CUR);
 750        __u32 pmu_num = 0;
 751        int ret;
 752
 753        /* write real pmu_num later */
 754        ret = do_write(fd, &pmu_num, sizeof(pmu_num));
 755        if (ret < 0)
 756                return ret;
 757
 758        while ((pmu = perf_pmu__scan(pmu))) {
 759                if (!pmu->name)
 760                        continue;
 761                pmu_num++;
 762
 763                ret = do_write(fd, &pmu->type, sizeof(pmu->type));
 764                if (ret < 0)
 765                        return ret;
 766
 767                ret = do_write_string(fd, pmu->name);
 768                if (ret < 0)
 769                        return ret;
 770        }
 771
 772        if (pwrite(fd, &pmu_num, sizeof(pmu_num), offset) != sizeof(pmu_num)) {
 773                /* discard all */
 774                lseek(fd, offset, SEEK_SET);
 775                return -1;
 776        }
 777
 778        return 0;
 779}
 780
 781/*
 782 * File format:
 783 *
 784 * struct group_descs {
 785 *      u32     nr_groups;
 786 *      struct group_desc {
 787 *              char    name[];
 788 *              u32     leader_idx;
 789 *              u32     nr_members;
 790 *      }[nr_groups];
 791 * };
 792 */
 793static int write_group_desc(int fd, struct perf_header *h __maybe_unused,
 794                            struct perf_evlist *evlist)
 795{
 796        u32 nr_groups = evlist->nr_groups;
 797        struct perf_evsel *evsel;
 798        int ret;
 799
 800        ret = do_write(fd, &nr_groups, sizeof(nr_groups));
 801        if (ret < 0)
 802                return ret;
 803
 804        evlist__for_each_entry(evlist, evsel) {
 805                if (perf_evsel__is_group_leader(evsel) &&
 806                    evsel->nr_members > 1) {
 807                        const char *name = evsel->group_name ?: "{anon_group}";
 808                        u32 leader_idx = evsel->idx;
 809                        u32 nr_members = evsel->nr_members;
 810
 811                        ret = do_write_string(fd, name);
 812                        if (ret < 0)
 813                                return ret;
 814
 815                        ret = do_write(fd, &leader_idx, sizeof(leader_idx));
 816                        if (ret < 0)
 817                                return ret;
 818
 819                        ret = do_write(fd, &nr_members, sizeof(nr_members));
 820                        if (ret < 0)
 821                                return ret;
 822                }
 823        }
 824        return 0;
 825}
 826
 827/*
 828 * default get_cpuid(): nothing gets recorded
 829 * actual implementation must be in arch/$(ARCH)/util/header.c
 830 */
 831int __attribute__ ((weak)) get_cpuid(char *buffer __maybe_unused,
 832                                     size_t sz __maybe_unused)
 833{
 834        return -1;
 835}
 836
 837static int write_cpuid(int fd, struct perf_header *h __maybe_unused,
 838                       struct perf_evlist *evlist __maybe_unused)
 839{
 840        char buffer[64];
 841        int ret;
 842
 843        ret = get_cpuid(buffer, sizeof(buffer));
 844        if (!ret)
 845                goto write_it;
 846
 847        return -1;
 848write_it:
 849        return do_write_string(fd, buffer);
 850}
 851
 852static int write_branch_stack(int fd __maybe_unused,
 853                              struct perf_header *h __maybe_unused,
 854                       struct perf_evlist *evlist __maybe_unused)
 855{
 856        return 0;
 857}
 858
 859static int write_auxtrace(int fd, struct perf_header *h,
 860                          struct perf_evlist *evlist __maybe_unused)
 861{
 862        struct perf_session *session;
 863        int err;
 864
 865        session = container_of(h, struct perf_session, header);
 866
 867        err = auxtrace_index__write(fd, &session->auxtrace_index);
 868        if (err < 0)
 869                pr_err("Failed to write auxtrace index\n");
 870        return err;
 871}
 872
 873static int cpu_cache_level__sort(const void *a, const void *b)
 874{
 875        struct cpu_cache_level *cache_a = (struct cpu_cache_level *)a;
 876        struct cpu_cache_level *cache_b = (struct cpu_cache_level *)b;
 877
 878        return cache_a->level - cache_b->level;
 879}
 880
 881static bool cpu_cache_level__cmp(struct cpu_cache_level *a, struct cpu_cache_level *b)
 882{
 883        if (a->level != b->level)
 884                return false;
 885
 886        if (a->line_size != b->line_size)
 887                return false;
 888
 889        if (a->sets != b->sets)
 890                return false;
 891
 892        if (a->ways != b->ways)
 893                return false;
 894
 895        if (strcmp(a->type, b->type))
 896                return false;
 897
 898        if (strcmp(a->size, b->size))
 899                return false;
 900
 901        if (strcmp(a->map, b->map))
 902                return false;
 903
 904        return true;
 905}
 906
 907static int cpu_cache_level__read(struct cpu_cache_level *cache, u32 cpu, u16 level)
 908{
 909        char path[PATH_MAX], file[PATH_MAX];
 910        struct stat st;
 911        size_t len;
 912
 913        scnprintf(path, PATH_MAX, "devices/system/cpu/cpu%d/cache/index%d/", cpu, level);
 914        scnprintf(file, PATH_MAX, "%s/%s", sysfs__mountpoint(), path);
 915
 916        if (stat(file, &st))
 917                return 1;
 918
 919        scnprintf(file, PATH_MAX, "%s/level", path);
 920        if (sysfs__read_int(file, (int *) &cache->level))
 921                return -1;
 922
 923        scnprintf(file, PATH_MAX, "%s/coherency_line_size", path);
 924        if (sysfs__read_int(file, (int *) &cache->line_size))
 925                return -1;
 926
 927        scnprintf(file, PATH_MAX, "%s/number_of_sets", path);
 928        if (sysfs__read_int(file, (int *) &cache->sets))
 929                return -1;
 930
 931        scnprintf(file, PATH_MAX, "%s/ways_of_associativity", path);
 932        if (sysfs__read_int(file, (int *) &cache->ways))
 933                return -1;
 934
 935        scnprintf(file, PATH_MAX, "%s/type", path);
 936        if (sysfs__read_str(file, &cache->type, &len))
 937                return -1;
 938
 939        cache->type[len] = 0;
 940        cache->type = rtrim(cache->type);
 941
 942        scnprintf(file, PATH_MAX, "%s/size", path);
 943        if (sysfs__read_str(file, &cache->size, &len)) {
 944                free(cache->type);
 945                return -1;
 946        }
 947
 948        cache->size[len] = 0;
 949        cache->size = rtrim(cache->size);
 950
 951        scnprintf(file, PATH_MAX, "%s/shared_cpu_list", path);
 952        if (sysfs__read_str(file, &cache->map, &len)) {
 953                free(cache->map);
 954                free(cache->type);
 955                return -1;
 956        }
 957
 958        cache->map[len] = 0;
 959        cache->map = rtrim(cache->map);
 960        return 0;
 961}
 962
 963static void cpu_cache_level__fprintf(FILE *out, struct cpu_cache_level *c)
 964{
 965        fprintf(out, "L%d %-15s %8s [%s]\n", c->level, c->type, c->size, c->map);
 966}
 967
 968static int build_caches(struct cpu_cache_level caches[], u32 size, u32 *cntp)
 969{
 970        u32 i, cnt = 0;
 971        long ncpus;
 972        u32 nr, cpu;
 973        u16 level;
 974
 975        ncpus = sysconf(_SC_NPROCESSORS_CONF);
 976        if (ncpus < 0)
 977                return -1;
 978
 979        nr = (u32)(ncpus & UINT_MAX);
 980
 981        for (cpu = 0; cpu < nr; cpu++) {
 982                for (level = 0; level < 10; level++) {
 983                        struct cpu_cache_level c;
 984                        int err;
 985
 986                        err = cpu_cache_level__read(&c, cpu, level);
 987                        if (err < 0)
 988                                return err;
 989
 990                        if (err == 1)
 991                                break;
 992
 993                        for (i = 0; i < cnt; i++) {
 994                                if (cpu_cache_level__cmp(&c, &caches[i]))
 995                                        break;
 996                        }
 997
 998                        if (i == cnt)
 999                                caches[cnt++] = c;
1000                        else
1001                                cpu_cache_level__free(&c);
1002
1003                        if (WARN_ONCE(cnt == size, "way too many cpu caches.."))
1004                                goto out;
1005                }
1006        }
1007 out:
1008        *cntp = cnt;
1009        return 0;
1010}
1011
1012#define MAX_CACHES 2000
1013
1014static int write_cache(int fd, struct perf_header *h __maybe_unused,
1015                          struct perf_evlist *evlist __maybe_unused)
1016{
1017        struct cpu_cache_level caches[MAX_CACHES];
1018        u32 cnt = 0, i, version = 1;
1019        int ret;
1020
1021        ret = build_caches(caches, MAX_CACHES, &cnt);
1022        if (ret)
1023                goto out;
1024
1025        qsort(&caches, cnt, sizeof(struct cpu_cache_level), cpu_cache_level__sort);
1026
1027        ret = do_write(fd, &version, sizeof(u32));
1028        if (ret < 0)
1029                goto out;
1030
1031        ret = do_write(fd, &cnt, sizeof(u32));
1032        if (ret < 0)
1033                goto out;
1034
1035        for (i = 0; i < cnt; i++) {
1036                struct cpu_cache_level *c = &caches[i];
1037
1038                #define _W(v)                                   \
1039                        ret = do_write(fd, &c->v, sizeof(u32)); \
1040                        if (ret < 0)                            \
1041                                goto out;
1042
1043                _W(level)
1044                _W(line_size)
1045                _W(sets)
1046                _W(ways)
1047                #undef _W
1048
1049                #define _W(v)                                           \
1050                        ret = do_write_string(fd, (const char *) c->v); \
1051                        if (ret < 0)                                    \
1052                                goto out;
1053
1054                _W(type)
1055                _W(size)
1056                _W(map)
1057                #undef _W
1058        }
1059
1060out:
1061        for (i = 0; i < cnt; i++)
1062                cpu_cache_level__free(&caches[i]);
1063        return ret;
1064}
1065
1066static int write_stat(int fd __maybe_unused,
1067                      struct perf_header *h __maybe_unused,
1068                      struct perf_evlist *evlist __maybe_unused)
1069{
1070        return 0;
1071}
1072
1073static void print_hostname(struct perf_header *ph, int fd __maybe_unused,
1074                           FILE *fp)
1075{
1076        fprintf(fp, "# hostname : %s\n", ph->env.hostname);
1077}
1078
1079static void print_osrelease(struct perf_header *ph, int fd __maybe_unused,
1080                            FILE *fp)
1081{
1082        fprintf(fp, "# os release : %s\n", ph->env.os_release);
1083}
1084
1085static void print_arch(struct perf_header *ph, int fd __maybe_unused, FILE *fp)
1086{
1087        fprintf(fp, "# arch : %s\n", ph->env.arch);
1088}
1089
1090static void print_cpudesc(struct perf_header *ph, int fd __maybe_unused,
1091                          FILE *fp)
1092{
1093        fprintf(fp, "# cpudesc : %s\n", ph->env.cpu_desc);
1094}
1095
1096static void print_nrcpus(struct perf_header *ph, int fd __maybe_unused,
1097                         FILE *fp)
1098{
1099        fprintf(fp, "# nrcpus online : %u\n", ph->env.nr_cpus_online);
1100        fprintf(fp, "# nrcpus avail : %u\n", ph->env.nr_cpus_avail);
1101}
1102
1103static void print_version(struct perf_header *ph, int fd __maybe_unused,
1104                          FILE *fp)
1105{
1106        fprintf(fp, "# perf version : %s\n", ph->env.version);
1107}
1108
1109static void print_cmdline(struct perf_header *ph, int fd __maybe_unused,
1110                          FILE *fp)
1111{
1112        int nr, i;
1113
1114        nr = ph->env.nr_cmdline;
1115
1116        fprintf(fp, "# cmdline : ");
1117
1118        for (i = 0; i < nr; i++)
1119                fprintf(fp, "%s ", ph->env.cmdline_argv[i]);
1120        fputc('\n', fp);
1121}
1122
1123static void print_cpu_topology(struct perf_header *ph, int fd __maybe_unused,
1124                               FILE *fp)
1125{
1126        int nr, i;
1127        char *str;
1128        int cpu_nr = ph->env.nr_cpus_online;
1129
1130        nr = ph->env.nr_sibling_cores;
1131        str = ph->env.sibling_cores;
1132
1133        for (i = 0; i < nr; i++) {
1134                fprintf(fp, "# sibling cores   : %s\n", str);
1135                str += strlen(str) + 1;
1136        }
1137
1138        nr = ph->env.nr_sibling_threads;
1139        str = ph->env.sibling_threads;
1140
1141        for (i = 0; i < nr; i++) {
1142                fprintf(fp, "# sibling threads : %s\n", str);
1143                str += strlen(str) + 1;
1144        }
1145
1146        if (ph->env.cpu != NULL) {
1147                for (i = 0; i < cpu_nr; i++)
1148                        fprintf(fp, "# CPU %d: Core ID %d, Socket ID %d\n", i,
1149                                ph->env.cpu[i].core_id, ph->env.cpu[i].socket_id);
1150        } else
1151                fprintf(fp, "# Core ID and Socket ID information is not available\n");
1152}
1153
1154static void free_event_desc(struct perf_evsel *events)
1155{
1156        struct perf_evsel *evsel;
1157
1158        if (!events)
1159                return;
1160
1161        for (evsel = events; evsel->attr.size; evsel++) {
1162                zfree(&evsel->name);
1163                zfree(&evsel->id);
1164        }
1165
1166        free(events);
1167}
1168
1169static struct perf_evsel *
1170read_event_desc(struct perf_header *ph, int fd)
1171{
1172        struct perf_evsel *evsel, *events = NULL;
1173        u64 *id;
1174        void *buf = NULL;
1175        u32 nre, sz, nr, i, j;
1176        ssize_t ret;
1177        size_t msz;
1178
1179        /* number of events */
1180        ret = readn(fd, &nre, sizeof(nre));
1181        if (ret != (ssize_t)sizeof(nre))
1182                goto error;
1183
1184        if (ph->needs_swap)
1185                nre = bswap_32(nre);
1186
1187        ret = readn(fd, &sz, sizeof(sz));
1188        if (ret != (ssize_t)sizeof(sz))
1189                goto error;
1190
1191        if (ph->needs_swap)
1192                sz = bswap_32(sz);
1193
1194        /* buffer to hold on file attr struct */
1195        buf = malloc(sz);
1196        if (!buf)
1197                goto error;
1198
1199        /* the last event terminates with evsel->attr.size == 0: */
1200        events = calloc(nre + 1, sizeof(*events));
1201        if (!events)
1202                goto error;
1203
1204        msz = sizeof(evsel->attr);
1205        if (sz < msz)
1206                msz = sz;
1207
1208        for (i = 0, evsel = events; i < nre; evsel++, i++) {
1209                evsel->idx = i;
1210
1211                /*
1212                 * must read entire on-file attr struct to
1213                 * sync up with layout.
1214                 */
1215                ret = readn(fd, buf, sz);
1216                if (ret != (ssize_t)sz)
1217                        goto error;
1218
1219                if (ph->needs_swap)
1220                        perf_event__attr_swap(buf);
1221
1222                memcpy(&evsel->attr, buf, msz);
1223
1224                ret = readn(fd, &nr, sizeof(nr));
1225                if (ret != (ssize_t)sizeof(nr))
1226                        goto error;
1227
1228                if (ph->needs_swap) {
1229                        nr = bswap_32(nr);
1230                        evsel->needs_swap = true;
1231                }
1232
1233                evsel->name = do_read_string(fd, ph);
1234
1235                if (!nr)
1236                        continue;
1237
1238                id = calloc(nr, sizeof(*id));
1239                if (!id)
1240                        goto error;
1241                evsel->ids = nr;
1242                evsel->id = id;
1243
1244                for (j = 0 ; j < nr; j++) {
1245                        ret = readn(fd, id, sizeof(*id));
1246                        if (ret != (ssize_t)sizeof(*id))
1247                                goto error;
1248                        if (ph->needs_swap)
1249                                *id = bswap_64(*id);
1250                        id++;
1251                }
1252        }
1253out:
1254        free(buf);
1255        return events;
1256error:
1257        free_event_desc(events);
1258        events = NULL;
1259        goto out;
1260}
1261
1262static int __desc_attr__fprintf(FILE *fp, const char *name, const char *val,
1263                                void *priv __attribute__((unused)))
1264{
1265        return fprintf(fp, ", %s = %s", name, val);
1266}
1267
1268static void print_event_desc(struct perf_header *ph, int fd, FILE *fp)
1269{
1270        struct perf_evsel *evsel, *events = read_event_desc(ph, fd);
1271        u32 j;
1272        u64 *id;
1273
1274        if (!events) {
1275                fprintf(fp, "# event desc: not available or unable to read\n");
1276                return;
1277        }
1278
1279        for (evsel = events; evsel->attr.size; evsel++) {
1280                fprintf(fp, "# event : name = %s, ", evsel->name);
1281
1282                if (evsel->ids) {
1283                        fprintf(fp, ", id = {");
1284                        for (j = 0, id = evsel->id; j < evsel->ids; j++, id++) {
1285                                if (j)
1286                                        fputc(',', fp);
1287                                fprintf(fp, " %"PRIu64, *id);
1288                        }
1289                        fprintf(fp, " }");
1290                }
1291
1292                perf_event_attr__fprintf(fp, &evsel->attr, __desc_attr__fprintf, NULL);
1293
1294                fputc('\n', fp);
1295        }
1296
1297        free_event_desc(events);
1298}
1299
1300static void print_total_mem(struct perf_header *ph, int fd __maybe_unused,
1301                            FILE *fp)
1302{
1303        fprintf(fp, "# total memory : %Lu kB\n", ph->env.total_mem);
1304}
1305
1306static void print_numa_topology(struct perf_header *ph, int fd __maybe_unused,
1307                                FILE *fp)
1308{
1309        int i;
1310        struct numa_node *n;
1311
1312        for (i = 0; i < ph->env.nr_numa_nodes; i++) {
1313                n = &ph->env.numa_nodes[i];
1314
1315                fprintf(fp, "# node%u meminfo  : total = %"PRIu64" kB,"
1316                            " free = %"PRIu64" kB\n",
1317                        n->node, n->mem_total, n->mem_free);
1318
1319                fprintf(fp, "# node%u cpu list : ", n->node);
1320                cpu_map__fprintf(n->map, fp);
1321        }
1322}
1323
1324static void print_cpuid(struct perf_header *ph, int fd __maybe_unused, FILE *fp)
1325{
1326        fprintf(fp, "# cpuid : %s\n", ph->env.cpuid);
1327}
1328
1329static void print_branch_stack(struct perf_header *ph __maybe_unused,
1330                               int fd __maybe_unused, FILE *fp)
1331{
1332        fprintf(fp, "# contains samples with branch stack\n");
1333}
1334
1335static void print_auxtrace(struct perf_header *ph __maybe_unused,
1336                           int fd __maybe_unused, FILE *fp)
1337{
1338        fprintf(fp, "# contains AUX area data (e.g. instruction trace)\n");
1339}
1340
1341static void print_stat(struct perf_header *ph __maybe_unused,
1342                       int fd __maybe_unused, FILE *fp)
1343{
1344        fprintf(fp, "# contains stat data\n");
1345}
1346
1347static void print_cache(struct perf_header *ph __maybe_unused,
1348                        int fd __maybe_unused, FILE *fp __maybe_unused)
1349{
1350        int i;
1351
1352        fprintf(fp, "# CPU cache info:\n");
1353        for (i = 0; i < ph->env.caches_cnt; i++) {
1354                fprintf(fp, "#  ");
1355                cpu_cache_level__fprintf(fp, &ph->env.caches[i]);
1356        }
1357}
1358
1359static void print_pmu_mappings(struct perf_header *ph, int fd __maybe_unused,
1360                               FILE *fp)
1361{
1362        const char *delimiter = "# pmu mappings: ";
1363        char *str, *tmp;
1364        u32 pmu_num;
1365        u32 type;
1366
1367        pmu_num = ph->env.nr_pmu_mappings;
1368        if (!pmu_num) {
1369                fprintf(fp, "# pmu mappings: not available\n");
1370                return;
1371        }
1372
1373        str = ph->env.pmu_mappings;
1374
1375        while (pmu_num) {
1376                type = strtoul(str, &tmp, 0);
1377                if (*tmp != ':')
1378                        goto error;
1379
1380                str = tmp + 1;
1381                fprintf(fp, "%s%s = %" PRIu32, delimiter, str, type);
1382
1383                delimiter = ", ";
1384                str += strlen(str) + 1;
1385                pmu_num--;
1386        }
1387
1388        fprintf(fp, "\n");
1389
1390        if (!pmu_num)
1391                return;
1392error:
1393        fprintf(fp, "# pmu mappings: unable to read\n");
1394}
1395
1396static void print_group_desc(struct perf_header *ph, int fd __maybe_unused,
1397                             FILE *fp)
1398{
1399        struct perf_session *session;
1400        struct perf_evsel *evsel;
1401        u32 nr = 0;
1402
1403        session = container_of(ph, struct perf_session, header);
1404
1405        evlist__for_each_entry(session->evlist, evsel) {
1406                if (perf_evsel__is_group_leader(evsel) &&
1407                    evsel->nr_members > 1) {
1408                        fprintf(fp, "# group: %s{%s", evsel->group_name ?: "",
1409                                perf_evsel__name(evsel));
1410
1411                        nr = evsel->nr_members - 1;
1412                } else if (nr) {
1413                        fprintf(fp, ",%s", perf_evsel__name(evsel));
1414
1415                        if (--nr == 0)
1416                                fprintf(fp, "}\n");
1417                }
1418        }
1419}
1420
1421static int __event_process_build_id(struct build_id_event *bev,
1422                                    char *filename,
1423                                    struct perf_session *session)
1424{
1425        int err = -1;
1426        struct machine *machine;
1427        u16 cpumode;
1428        struct dso *dso;
1429        enum dso_kernel_type dso_type;
1430
1431        machine = perf_session__findnew_machine(session, bev->pid);
1432        if (!machine)
1433                goto out;
1434
1435        cpumode = bev->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
1436
1437        switch (cpumode) {
1438        case PERF_RECORD_MISC_KERNEL:
1439                dso_type = DSO_TYPE_KERNEL;
1440                break;
1441        case PERF_RECORD_MISC_GUEST_KERNEL:
1442                dso_type = DSO_TYPE_GUEST_KERNEL;
1443                break;
1444        case PERF_RECORD_MISC_USER:
1445        case PERF_RECORD_MISC_GUEST_USER:
1446                dso_type = DSO_TYPE_USER;
1447                break;
1448        default:
1449                goto out;
1450        }
1451
1452        dso = machine__findnew_dso(machine, filename);
1453        if (dso != NULL) {
1454                char sbuild_id[SBUILD_ID_SIZE];
1455
1456                dso__set_build_id(dso, &bev->build_id);
1457
1458                if (!is_kernel_module(filename, cpumode))
1459                        dso->kernel = dso_type;
1460
1461                build_id__sprintf(dso->build_id, sizeof(dso->build_id),
1462                                  sbuild_id);
1463                pr_debug("build id event received for %s: %s\n",
1464                         dso->long_name, sbuild_id);
1465                dso__put(dso);
1466        }
1467
1468        err = 0;
1469out:
1470        return err;
1471}
1472
1473static int perf_header__read_build_ids_abi_quirk(struct perf_header *header,
1474                                                 int input, u64 offset, u64 size)
1475{
1476        struct perf_session *session = container_of(header, struct perf_session, header);
1477        struct {
1478                struct perf_event_header   header;
1479                u8                         build_id[PERF_ALIGN(BUILD_ID_SIZE, sizeof(u64))];
1480                char                       filename[0];
1481        } old_bev;
1482        struct build_id_event bev;
1483        char filename[PATH_MAX];
1484        u64 limit = offset + size;
1485
1486        while (offset < limit) {
1487                ssize_t len;
1488
1489                if (readn(input, &old_bev, sizeof(old_bev)) != sizeof(old_bev))
1490                        return -1;
1491
1492                if (header->needs_swap)
1493                        perf_event_header__bswap(&old_bev.header);
1494
1495                len = old_bev.header.size - sizeof(old_bev);
1496                if (readn(input, filename, len) != len)
1497                        return -1;
1498
1499                bev.header = old_bev.header;
1500
1501                /*
1502                 * As the pid is the missing value, we need to fill
1503                 * it properly. The header.misc value give us nice hint.
1504                 */
1505                bev.pid = HOST_KERNEL_ID;
1506                if (bev.header.misc == PERF_RECORD_MISC_GUEST_USER ||
1507                    bev.header.misc == PERF_RECORD_MISC_GUEST_KERNEL)
1508                        bev.pid = DEFAULT_GUEST_KERNEL_ID;
1509
1510                memcpy(bev.build_id, old_bev.build_id, sizeof(bev.build_id));
1511                __event_process_build_id(&bev, filename, session);
1512
1513                offset += bev.header.size;
1514        }
1515
1516        return 0;
1517}
1518
1519static int perf_header__read_build_ids(struct perf_header *header,
1520                                       int input, u64 offset, u64 size)
1521{
1522        struct perf_session *session = container_of(header, struct perf_session, header);
1523        struct build_id_event bev;
1524        char filename[PATH_MAX];
1525        u64 limit = offset + size, orig_offset = offset;
1526        int err = -1;
1527
1528        while (offset < limit) {
1529                ssize_t len;
1530
1531                if (readn(input, &bev, sizeof(bev)) != sizeof(bev))
1532                        goto out;
1533
1534                if (header->needs_swap)
1535                        perf_event_header__bswap(&bev.header);
1536
1537                len = bev.header.size - sizeof(bev);
1538                if (readn(input, filename, len) != len)
1539                        goto out;
1540                /*
1541                 * The a1645ce1 changeset:
1542                 *
1543                 * "perf: 'perf kvm' tool for monitoring guest performance from host"
1544                 *
1545                 * Added a field to struct build_id_event that broke the file
1546                 * format.
1547                 *
1548                 * Since the kernel build-id is the first entry, process the
1549                 * table using the old format if the well known
1550                 * '[kernel.kallsyms]' string for the kernel build-id has the
1551                 * first 4 characters chopped off (where the pid_t sits).
1552                 */
1553                if (memcmp(filename, "nel.kallsyms]", 13) == 0) {
1554                        if (lseek(input, orig_offset, SEEK_SET) == (off_t)-1)
1555                                return -1;
1556                        return perf_header__read_build_ids_abi_quirk(header, input, offset, size);
1557                }
1558
1559                __event_process_build_id(&bev, filename, session);
1560
1561                offset += bev.header.size;
1562        }
1563        err = 0;
1564out:
1565        return err;
1566}
1567
1568static int process_tracing_data(struct perf_file_section *section __maybe_unused,
1569                                struct perf_header *ph __maybe_unused,
1570                                int fd, void *data)
1571{
1572        ssize_t ret = trace_report(fd, data, false);
1573        return ret < 0 ? -1 : 0;
1574}
1575
1576static int process_build_id(struct perf_file_section *section,
1577                            struct perf_header *ph, int fd,
1578                            void *data __maybe_unused)
1579{
1580        if (perf_header__read_build_ids(ph, fd, section->offset, section->size))
1581                pr_debug("Failed to read buildids, continuing...\n");
1582        return 0;
1583}
1584
1585static int process_hostname(struct perf_file_section *section __maybe_unused,
1586                            struct perf_header *ph, int fd,
1587                            void *data __maybe_unused)
1588{
1589        ph->env.hostname = do_read_string(fd, ph);
1590        return ph->env.hostname ? 0 : -ENOMEM;
1591}
1592
1593static int process_osrelease(struct perf_file_section *section __maybe_unused,
1594                             struct perf_header *ph, int fd,
1595                             void *data __maybe_unused)
1596{
1597        ph->env.os_release = do_read_string(fd, ph);
1598        return ph->env.os_release ? 0 : -ENOMEM;
1599}
1600
1601static int process_version(struct perf_file_section *section __maybe_unused,
1602                           struct perf_header *ph, int fd,
1603                           void *data __maybe_unused)
1604{
1605        ph->env.version = do_read_string(fd, ph);
1606        return ph->env.version ? 0 : -ENOMEM;
1607}
1608
1609static int process_arch(struct perf_file_section *section __maybe_unused,
1610                        struct perf_header *ph, int fd,
1611                        void *data __maybe_unused)
1612{
1613        ph->env.arch = do_read_string(fd, ph);
1614        return ph->env.arch ? 0 : -ENOMEM;
1615}
1616
1617static int process_nrcpus(struct perf_file_section *section __maybe_unused,
1618                          struct perf_header *ph, int fd,
1619                          void *data __maybe_unused)
1620{
1621        ssize_t ret;
1622        u32 nr;
1623
1624        ret = readn(fd, &nr, sizeof(nr));
1625        if (ret != sizeof(nr))
1626                return -1;
1627
1628        if (ph->needs_swap)
1629                nr = bswap_32(nr);
1630
1631        ph->env.nr_cpus_avail = nr;
1632
1633        ret = readn(fd, &nr, sizeof(nr));
1634        if (ret != sizeof(nr))
1635                return -1;
1636
1637        if (ph->needs_swap)
1638                nr = bswap_32(nr);
1639
1640        ph->env.nr_cpus_online = nr;
1641        return 0;
1642}
1643
1644static int process_cpudesc(struct perf_file_section *section __maybe_unused,
1645                           struct perf_header *ph, int fd,
1646                           void *data __maybe_unused)
1647{
1648        ph->env.cpu_desc = do_read_string(fd, ph);
1649        return ph->env.cpu_desc ? 0 : -ENOMEM;
1650}
1651
1652static int process_cpuid(struct perf_file_section *section __maybe_unused,
1653                         struct perf_header *ph,  int fd,
1654                         void *data __maybe_unused)
1655{
1656        ph->env.cpuid = do_read_string(fd, ph);
1657        return ph->env.cpuid ? 0 : -ENOMEM;
1658}
1659
1660static int process_total_mem(struct perf_file_section *section __maybe_unused,
1661                             struct perf_header *ph, int fd,
1662                             void *data __maybe_unused)
1663{
1664        uint64_t mem;
1665        ssize_t ret;
1666
1667        ret = readn(fd, &mem, sizeof(mem));
1668        if (ret != sizeof(mem))
1669                return -1;
1670
1671        if (ph->needs_swap)
1672                mem = bswap_64(mem);
1673
1674        ph->env.total_mem = mem;
1675        return 0;
1676}
1677
1678static struct perf_evsel *
1679perf_evlist__find_by_index(struct perf_evlist *evlist, int idx)
1680{
1681        struct perf_evsel *evsel;
1682
1683        evlist__for_each_entry(evlist, evsel) {
1684                if (evsel->idx == idx)
1685                        return evsel;
1686        }
1687
1688        return NULL;
1689}
1690
1691static void
1692perf_evlist__set_event_name(struct perf_evlist *evlist,
1693                            struct perf_evsel *event)
1694{
1695        struct perf_evsel *evsel;
1696
1697        if (!event->name)
1698                return;
1699
1700        evsel = perf_evlist__find_by_index(evlist, event->idx);
1701        if (!evsel)
1702                return;
1703
1704        if (evsel->name)
1705                return;
1706
1707        evsel->name = strdup(event->name);
1708}
1709
1710static int
1711process_event_desc(struct perf_file_section *section __maybe_unused,
1712                   struct perf_header *header, int fd,
1713                   void *data __maybe_unused)
1714{
1715        struct perf_session *session;
1716        struct perf_evsel *evsel, *events = read_event_desc(header, fd);
1717
1718        if (!events)
1719                return 0;
1720
1721        session = container_of(header, struct perf_session, header);
1722        for (evsel = events; evsel->attr.size; evsel++)
1723                perf_evlist__set_event_name(session->evlist, evsel);
1724
1725        free_event_desc(events);
1726
1727        return 0;
1728}
1729
1730static int process_cmdline(struct perf_file_section *section,
1731                           struct perf_header *ph, int fd,
1732                           void *data __maybe_unused)
1733{
1734        ssize_t ret;
1735        char *str, *cmdline = NULL, **argv = NULL;
1736        u32 nr, i, len = 0;
1737
1738        ret = readn(fd, &nr, sizeof(nr));
1739        if (ret != sizeof(nr))
1740                return -1;
1741
1742        if (ph->needs_swap)
1743                nr = bswap_32(nr);
1744
1745        ph->env.nr_cmdline = nr;
1746
1747        cmdline = zalloc(section->size + nr + 1);
1748        if (!cmdline)
1749                return -1;
1750
1751        argv = zalloc(sizeof(char *) * (nr + 1));
1752        if (!argv)
1753                goto error;
1754
1755        for (i = 0; i < nr; i++) {
1756                str = do_read_string(fd, ph);
1757                if (!str)
1758                        goto error;
1759
1760                argv[i] = cmdline + len;
1761                memcpy(argv[i], str, strlen(str) + 1);
1762                len += strlen(str) + 1;
1763                free(str);
1764        }
1765        ph->env.cmdline = cmdline;
1766        ph->env.cmdline_argv = (const char **) argv;
1767        return 0;
1768
1769error:
1770        free(argv);
1771        free(cmdline);
1772        return -1;
1773}
1774
1775static int process_cpu_topology(struct perf_file_section *section,
1776                                struct perf_header *ph, int fd,
1777                                void *data __maybe_unused)
1778{
1779        ssize_t ret;
1780        u32 nr, i;
1781        char *str;
1782        struct strbuf sb;
1783        int cpu_nr = ph->env.nr_cpus_online;
1784        u64 size = 0;
1785
1786        ph->env.cpu = calloc(cpu_nr, sizeof(*ph->env.cpu));
1787        if (!ph->env.cpu)
1788                return -1;
1789
1790        ret = readn(fd, &nr, sizeof(nr));
1791        if (ret != sizeof(nr))
1792                goto free_cpu;
1793
1794        if (ph->needs_swap)
1795                nr = bswap_32(nr);
1796
1797        ph->env.nr_sibling_cores = nr;
1798        size += sizeof(u32);
1799        if (strbuf_init(&sb, 128) < 0)
1800                goto free_cpu;
1801
1802        for (i = 0; i < nr; i++) {
1803                str = do_read_string(fd, ph);
1804                if (!str)
1805                        goto error;
1806
1807                /* include a NULL character at the end */
1808                if (strbuf_add(&sb, str, strlen(str) + 1) < 0)
1809                        goto error;
1810                size += string_size(str);
1811                free(str);
1812        }
1813        ph->env.sibling_cores = strbuf_detach(&sb, NULL);
1814
1815        ret = readn(fd, &nr, sizeof(nr));
1816        if (ret != sizeof(nr))
1817                return -1;
1818
1819        if (ph->needs_swap)
1820                nr = bswap_32(nr);
1821
1822        ph->env.nr_sibling_threads = nr;
1823        size += sizeof(u32);
1824
1825        for (i = 0; i < nr; i++) {
1826                str = do_read_string(fd, ph);
1827                if (!str)
1828                        goto error;
1829
1830                /* include a NULL character at the end */
1831                if (strbuf_add(&sb, str, strlen(str) + 1) < 0)
1832                        goto error;
1833                size += string_size(str);
1834                free(str);
1835        }
1836        ph->env.sibling_threads = strbuf_detach(&sb, NULL);
1837
1838        /*
1839         * The header may be from old perf,
1840         * which doesn't include core id and socket id information.
1841         */
1842        if (section->size <= size) {
1843                zfree(&ph->env.cpu);
1844                return 0;
1845        }
1846
1847        for (i = 0; i < (u32)cpu_nr; i++) {
1848                ret = readn(fd, &nr, sizeof(nr));
1849                if (ret != sizeof(nr))
1850                        goto free_cpu;
1851
1852                if (ph->needs_swap)
1853                        nr = bswap_32(nr);
1854
1855                ph->env.cpu[i].core_id = nr;
1856
1857                ret = readn(fd, &nr, sizeof(nr));
1858                if (ret != sizeof(nr))
1859                        goto free_cpu;
1860
1861                if (ph->needs_swap)
1862                        nr = bswap_32(nr);
1863
1864                if (nr > (u32)cpu_nr) {
1865                        pr_debug("socket_id number is too big."
1866                                 "You may need to upgrade the perf tool.\n");
1867                        goto free_cpu;
1868                }
1869
1870                ph->env.cpu[i].socket_id = nr;
1871        }
1872
1873        return 0;
1874
1875error:
1876        strbuf_release(&sb);
1877free_cpu:
1878        zfree(&ph->env.cpu);
1879        return -1;
1880}
1881
1882static int process_numa_topology(struct perf_file_section *section __maybe_unused,
1883                                 struct perf_header *ph, int fd,
1884                                 void *data __maybe_unused)
1885{
1886        struct numa_node *nodes, *n;
1887        ssize_t ret;
1888        u32 nr, i;
1889        char *str;
1890
1891        /* nr nodes */
1892        ret = readn(fd, &nr, sizeof(nr));
1893        if (ret != sizeof(nr))
1894                return -1;
1895
1896        if (ph->needs_swap)
1897                nr = bswap_32(nr);
1898
1899        ph->env.nr_numa_nodes = nr;
1900        nodes = zalloc(sizeof(*nodes) * nr);
1901        if (!nodes)
1902                return -ENOMEM;
1903
1904        for (i = 0; i < nr; i++) {
1905                n = &nodes[i];
1906
1907                /* node number */
1908                ret = readn(fd, &n->node, sizeof(u32));
1909                if (ret != sizeof(n->node))
1910                        goto error;
1911
1912                ret = readn(fd, &n->mem_total, sizeof(u64));
1913                if (ret != sizeof(u64))
1914                        goto error;
1915
1916                ret = readn(fd, &n->mem_free, sizeof(u64));
1917                if (ret != sizeof(u64))
1918                        goto error;
1919
1920                if (ph->needs_swap) {
1921                        n->node      = bswap_32(n->node);
1922                        n->mem_total = bswap_64(n->mem_total);
1923                        n->mem_free  = bswap_64(n->mem_free);
1924                }
1925
1926                str = do_read_string(fd, ph);
1927                if (!str)
1928                        goto error;
1929
1930                n->map = cpu_map__new(str);
1931                if (!n->map)
1932                        goto error;
1933
1934                free(str);
1935        }
1936        ph->env.numa_nodes = nodes;
1937        return 0;
1938
1939error:
1940        free(nodes);
1941        return -1;
1942}
1943
1944static int process_pmu_mappings(struct perf_file_section *section __maybe_unused,
1945                                struct perf_header *ph, int fd,
1946                                void *data __maybe_unused)
1947{
1948        ssize_t ret;
1949        char *name;
1950        u32 pmu_num;
1951        u32 type;
1952        struct strbuf sb;
1953
1954        ret = readn(fd, &pmu_num, sizeof(pmu_num));
1955        if (ret != sizeof(pmu_num))
1956                return -1;
1957
1958        if (ph->needs_swap)
1959                pmu_num = bswap_32(pmu_num);
1960
1961        if (!pmu_num) {
1962                pr_debug("pmu mappings not available\n");
1963                return 0;
1964        }
1965
1966        ph->env.nr_pmu_mappings = pmu_num;
1967        if (strbuf_init(&sb, 128) < 0)
1968                return -1;
1969
1970        while (pmu_num) {
1971                if (readn(fd, &type, sizeof(type)) != sizeof(type))
1972                        goto error;
1973                if (ph->needs_swap)
1974                        type = bswap_32(type);
1975
1976                name = do_read_string(fd, ph);
1977                if (!name)
1978                        goto error;
1979
1980                if (strbuf_addf(&sb, "%u:%s", type, name) < 0)
1981                        goto error;
1982                /* include a NULL character at the end */
1983                if (strbuf_add(&sb, "", 1) < 0)
1984                        goto error;
1985
1986                if (!strcmp(name, "msr"))
1987                        ph->env.msr_pmu_type = type;
1988
1989                free(name);
1990                pmu_num--;
1991        }
1992        ph->env.pmu_mappings = strbuf_detach(&sb, NULL);
1993        return 0;
1994
1995error:
1996        strbuf_release(&sb);
1997        return -1;
1998}
1999
2000static int process_group_desc(struct perf_file_section *section __maybe_unused,
2001                              struct perf_header *ph, int fd,
2002                              void *data __maybe_unused)
2003{
2004        size_t ret = -1;
2005        u32 i, nr, nr_groups;
2006        struct perf_session *session;
2007        struct perf_evsel *evsel, *leader = NULL;
2008        struct group_desc {
2009                char *name;
2010                u32 leader_idx;
2011                u32 nr_members;
2012        } *desc;
2013
2014        if (readn(fd, &nr_groups, sizeof(nr_groups)) != sizeof(nr_groups))
2015                return -1;
2016
2017        if (ph->needs_swap)
2018                nr_groups = bswap_32(nr_groups);
2019
2020        ph->env.nr_groups = nr_groups;
2021        if (!nr_groups) {
2022                pr_debug("group desc not available\n");
2023                return 0;
2024        }
2025
2026        desc = calloc(nr_groups, sizeof(*desc));
2027        if (!desc)
2028                return -1;
2029
2030        for (i = 0; i < nr_groups; i++) {
2031                desc[i].name = do_read_string(fd, ph);
2032                if (!desc[i].name)
2033                        goto out_free;
2034
2035                if (readn(fd, &desc[i].leader_idx, sizeof(u32)) != sizeof(u32))
2036                        goto out_free;
2037
2038                if (readn(fd, &desc[i].nr_members, sizeof(u32)) != sizeof(u32))
2039                        goto out_free;
2040
2041                if (ph->needs_swap) {
2042                        desc[i].leader_idx = bswap_32(desc[i].leader_idx);
2043                        desc[i].nr_members = bswap_32(desc[i].nr_members);
2044                }
2045        }
2046
2047        /*
2048         * Rebuild group relationship based on the group_desc
2049         */
2050        session = container_of(ph, struct perf_session, header);
2051        session->evlist->nr_groups = nr_groups;
2052
2053        i = nr = 0;
2054        evlist__for_each_entry(session->evlist, evsel) {
2055                if (evsel->idx == (int) desc[i].leader_idx) {
2056                        evsel->leader = evsel;
2057                        /* {anon_group} is a dummy name */
2058                        if (strcmp(desc[i].name, "{anon_group}")) {
2059                                evsel->group_name = desc[i].name;
2060                                desc[i].name = NULL;
2061                        }
2062                        evsel->nr_members = desc[i].nr_members;
2063
2064                        if (i >= nr_groups || nr > 0) {
2065                                pr_debug("invalid group desc\n");
2066                                goto out_free;
2067                        }
2068
2069                        leader = evsel;
2070                        nr = evsel->nr_members - 1;
2071                        i++;
2072                } else if (nr) {
2073                        /* This is a group member */
2074                        evsel->leader = leader;
2075
2076                        nr--;
2077                }
2078        }
2079
2080        if (i != nr_groups || nr != 0) {
2081                pr_debug("invalid group desc\n");
2082                goto out_free;
2083        }
2084
2085        ret = 0;
2086out_free:
2087        for (i = 0; i < nr_groups; i++)
2088                zfree(&desc[i].name);
2089        free(desc);
2090
2091        return ret;
2092}
2093
2094static int process_auxtrace(struct perf_file_section *section,
2095                            struct perf_header *ph, int fd,
2096                            void *data __maybe_unused)
2097{
2098        struct perf_session *session;
2099        int err;
2100
2101        session = container_of(ph, struct perf_session, header);
2102
2103        err = auxtrace_index__process(fd, section->size, session,
2104                                      ph->needs_swap);
2105        if (err < 0)
2106                pr_err("Failed to process auxtrace index\n");
2107        return err;
2108}
2109
2110static int process_cache(struct perf_file_section *section __maybe_unused,
2111                         struct perf_header *ph __maybe_unused, int fd __maybe_unused,
2112                         void *data __maybe_unused)
2113{
2114        struct cpu_cache_level *caches;
2115        u32 cnt, i, version;
2116
2117        if (readn(fd, &version, sizeof(version)) != sizeof(version))
2118                return -1;
2119
2120        if (ph->needs_swap)
2121                version = bswap_32(version);
2122
2123        if (version != 1)
2124                return -1;
2125
2126        if (readn(fd, &cnt, sizeof(cnt)) != sizeof(cnt))
2127                return -1;
2128
2129        if (ph->needs_swap)
2130                cnt = bswap_32(cnt);
2131
2132        caches = zalloc(sizeof(*caches) * cnt);
2133        if (!caches)
2134                return -1;
2135
2136        for (i = 0; i < cnt; i++) {
2137                struct cpu_cache_level c;
2138
2139                #define _R(v)                                           \
2140                        if (readn(fd, &c.v, sizeof(u32)) != sizeof(u32))\
2141                                goto out_free_caches;                   \
2142                        if (ph->needs_swap)                             \
2143                                c.v = bswap_32(c.v);                    \
2144
2145                _R(level)
2146                _R(line_size)
2147                _R(sets)
2148                _R(ways)
2149                #undef _R
2150
2151                #define _R(v)                           \
2152                        c.v = do_read_string(fd, ph);   \
2153                        if (!c.v)                       \
2154                                goto out_free_caches;
2155
2156                _R(type)
2157                _R(size)
2158                _R(map)
2159                #undef _R
2160
2161                caches[i] = c;
2162        }
2163
2164        ph->env.caches = caches;
2165        ph->env.caches_cnt = cnt;
2166        return 0;
2167out_free_caches:
2168        free(caches);
2169        return -1;
2170}
2171
2172struct feature_ops {
2173        int (*write)(int fd, struct perf_header *h, struct perf_evlist *evlist);
2174        void (*print)(struct perf_header *h, int fd, FILE *fp);
2175        int (*process)(struct perf_file_section *section,
2176                       struct perf_header *h, int fd, void *data);
2177        const char *name;
2178        bool full_only;
2179};
2180
2181#define FEAT_OPA(n, func) \
2182        [n] = { .name = #n, .write = write_##func, .print = print_##func }
2183#define FEAT_OPP(n, func) \
2184        [n] = { .name = #n, .write = write_##func, .print = print_##func, \
2185                .process = process_##func }
2186#define FEAT_OPF(n, func) \
2187        [n] = { .name = #n, .write = write_##func, .print = print_##func, \
2188                .process = process_##func, .full_only = true }
2189
2190/* feature_ops not implemented: */
2191#define print_tracing_data      NULL
2192#define print_build_id          NULL
2193
2194static const struct feature_ops feat_ops[HEADER_LAST_FEATURE] = {
2195        FEAT_OPP(HEADER_TRACING_DATA,   tracing_data),
2196        FEAT_OPP(HEADER_BUILD_ID,       build_id),
2197        FEAT_OPP(HEADER_HOSTNAME,       hostname),
2198        FEAT_OPP(HEADER_OSRELEASE,      osrelease),
2199        FEAT_OPP(HEADER_VERSION,        version),
2200        FEAT_OPP(HEADER_ARCH,           arch),
2201        FEAT_OPP(HEADER_NRCPUS,         nrcpus),
2202        FEAT_OPP(HEADER_CPUDESC,        cpudesc),
2203        FEAT_OPP(HEADER_CPUID,          cpuid),
2204        FEAT_OPP(HEADER_TOTAL_MEM,      total_mem),
2205        FEAT_OPP(HEADER_EVENT_DESC,     event_desc),
2206        FEAT_OPP(HEADER_CMDLINE,        cmdline),
2207        FEAT_OPF(HEADER_CPU_TOPOLOGY,   cpu_topology),
2208        FEAT_OPF(HEADER_NUMA_TOPOLOGY,  numa_topology),
2209        FEAT_OPA(HEADER_BRANCH_STACK,   branch_stack),
2210        FEAT_OPP(HEADER_PMU_MAPPINGS,   pmu_mappings),
2211        FEAT_OPP(HEADER_GROUP_DESC,     group_desc),
2212        FEAT_OPP(HEADER_AUXTRACE,       auxtrace),
2213        FEAT_OPA(HEADER_STAT,           stat),
2214        FEAT_OPF(HEADER_CACHE,          cache),
2215};
2216
2217struct header_print_data {
2218        FILE *fp;
2219        bool full; /* extended list of headers */
2220};
2221
2222static int perf_file_section__fprintf_info(struct perf_file_section *section,
2223                                           struct perf_header *ph,
2224                                           int feat, int fd, void *data)
2225{
2226        struct header_print_data *hd = data;
2227
2228        if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) {
2229                pr_debug("Failed to lseek to %" PRIu64 " offset for feature "
2230                                "%d, continuing...\n", section->offset, feat);
2231                return 0;
2232        }
2233        if (feat >= HEADER_LAST_FEATURE) {
2234                pr_warning("unknown feature %d\n", feat);
2235                return 0;
2236        }
2237        if (!feat_ops[feat].print)
2238                return 0;
2239
2240        if (!feat_ops[feat].full_only || hd->full)
2241                feat_ops[feat].print(ph, fd, hd->fp);
2242        else
2243                fprintf(hd->fp, "# %s info available, use -I to display\n",
2244                        feat_ops[feat].name);
2245
2246        return 0;
2247}
2248
2249int perf_header__fprintf_info(struct perf_session *session, FILE *fp, bool full)
2250{
2251        struct header_print_data hd;
2252        struct perf_header *header = &session->header;
2253        int fd = perf_data_file__fd(session->file);
2254        hd.fp = fp;
2255        hd.full = full;
2256
2257        perf_header__process_sections(header, fd, &hd,
2258                                      perf_file_section__fprintf_info);
2259        return 0;
2260}
2261
2262static int do_write_feat(int fd, struct perf_header *h, int type,
2263                         struct perf_file_section **p,
2264                         struct perf_evlist *evlist)
2265{
2266        int err;
2267        int ret = 0;
2268
2269        if (perf_header__has_feat(h, type)) {
2270                if (!feat_ops[type].write)
2271                        return -1;
2272
2273                (*p)->offset = lseek(fd, 0, SEEK_CUR);
2274
2275                err = feat_ops[type].write(fd, h, evlist);
2276                if (err < 0) {
2277                        pr_debug("failed to write feature %d\n", type);
2278
2279                        /* undo anything written */
2280                        lseek(fd, (*p)->offset, SEEK_SET);
2281
2282                        return -1;
2283                }
2284                (*p)->size = lseek(fd, 0, SEEK_CUR) - (*p)->offset;
2285                (*p)++;
2286        }
2287        return ret;
2288}
2289
2290static int perf_header__adds_write(struct perf_header *header,
2291                                   struct perf_evlist *evlist, int fd)
2292{
2293        int nr_sections;
2294        struct perf_file_section *feat_sec, *p;
2295        int sec_size;
2296        u64 sec_start;
2297        int feat;
2298        int err;
2299
2300        nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS);
2301        if (!nr_sections)
2302                return 0;
2303
2304        feat_sec = p = calloc(nr_sections, sizeof(*feat_sec));
2305        if (feat_sec == NULL)
2306                return -ENOMEM;
2307
2308        sec_size = sizeof(*feat_sec) * nr_sections;
2309
2310        sec_start = header->feat_offset;
2311        lseek(fd, sec_start + sec_size, SEEK_SET);
2312
2313        for_each_set_bit(feat, header->adds_features, HEADER_FEAT_BITS) {
2314                if (do_write_feat(fd, header, feat, &p, evlist))
2315                        perf_header__clear_feat(header, feat);
2316        }
2317
2318        lseek(fd, sec_start, SEEK_SET);
2319        /*
2320         * may write more than needed due to dropped feature, but
2321         * this is okay, reader will skip the mising entries
2322         */
2323        err = do_write(fd, feat_sec, sec_size);
2324        if (err < 0)
2325                pr_debug("failed to write feature section\n");
2326        free(feat_sec);
2327        return err;
2328}
2329
2330int perf_header__write_pipe(int fd)
2331{
2332        struct perf_pipe_file_header f_header;
2333        int err;
2334
2335        f_header = (struct perf_pipe_file_header){
2336                .magic     = PERF_MAGIC,
2337                .size      = sizeof(f_header),
2338        };
2339
2340        err = do_write(fd, &f_header, sizeof(f_header));
2341        if (err < 0) {
2342                pr_debug("failed to write perf pipe header\n");
2343                return err;
2344        }
2345
2346        return 0;
2347}
2348
2349int perf_session__write_header(struct perf_session *session,
2350                               struct perf_evlist *evlist,
2351                               int fd, bool at_exit)
2352{
2353        struct perf_file_header f_header;
2354        struct perf_file_attr   f_attr;
2355        struct perf_header *header = &session->header;
2356        struct perf_evsel *evsel;
2357        u64 attr_offset;
2358        int err;
2359
2360        lseek(fd, sizeof(f_header), SEEK_SET);
2361
2362        evlist__for_each_entry(session->evlist, evsel) {
2363                evsel->id_offset = lseek(fd, 0, SEEK_CUR);
2364                err = do_write(fd, evsel->id, evsel->ids * sizeof(u64));
2365                if (err < 0) {
2366                        pr_debug("failed to write perf header\n");
2367                        return err;
2368                }
2369        }
2370
2371        attr_offset = lseek(fd, 0, SEEK_CUR);
2372
2373        evlist__for_each_entry(evlist, evsel) {
2374                f_attr = (struct perf_file_attr){
2375                        .attr = evsel->attr,
2376                        .ids  = {
2377                                .offset = evsel->id_offset,
2378                                .size   = evsel->ids * sizeof(u64),
2379                        }
2380                };
2381                err = do_write(fd, &f_attr, sizeof(f_attr));
2382                if (err < 0) {
2383                        pr_debug("failed to write perf header attribute\n");
2384                        return err;
2385                }
2386        }
2387
2388        if (!header->data_offset)
2389                header->data_offset = lseek(fd, 0, SEEK_CUR);
2390        header->feat_offset = header->data_offset + header->data_size;
2391
2392        if (at_exit) {
2393                err = perf_header__adds_write(header, evlist, fd);
2394                if (err < 0)
2395                        return err;
2396        }
2397
2398        f_header = (struct perf_file_header){
2399                .magic     = PERF_MAGIC,
2400                .size      = sizeof(f_header),
2401                .attr_size = sizeof(f_attr),
2402                .attrs = {
2403                        .offset = attr_offset,
2404                        .size   = evlist->nr_entries * sizeof(f_attr),
2405                },
2406                .data = {
2407                        .offset = header->data_offset,
2408                        .size   = header->data_size,
2409                },
2410                /* event_types is ignored, store zeros */
2411        };
2412
2413        memcpy(&f_header.adds_features, &header->adds_features, sizeof(header->adds_features));
2414
2415        lseek(fd, 0, SEEK_SET);
2416        err = do_write(fd, &f_header, sizeof(f_header));
2417        if (err < 0) {
2418                pr_debug("failed to write perf header\n");
2419                return err;
2420        }
2421        lseek(fd, header->data_offset + header->data_size, SEEK_SET);
2422
2423        return 0;
2424}
2425
2426static int perf_header__getbuffer64(struct perf_header *header,
2427                                    int fd, void *buf, size_t size)
2428{
2429        if (readn(fd, buf, size) <= 0)
2430                return -1;
2431
2432        if (header->needs_swap)
2433                mem_bswap_64(buf, size);
2434
2435        return 0;
2436}
2437
2438int perf_header__process_sections(struct perf_header *header, int fd,
2439                                  void *data,
2440                                  int (*process)(struct perf_file_section *section,
2441                                                 struct perf_header *ph,
2442                                                 int feat, int fd, void *data))
2443{
2444        struct perf_file_section *feat_sec, *sec;
2445        int nr_sections;
2446        int sec_size;
2447        int feat;
2448        int err;
2449
2450        nr_sections = bitmap_weight(header->adds_features, HEADER_FEAT_BITS);
2451        if (!nr_sections)
2452                return 0;
2453
2454        feat_sec = sec = calloc(nr_sections, sizeof(*feat_sec));
2455        if (!feat_sec)
2456                return -1;
2457
2458        sec_size = sizeof(*feat_sec) * nr_sections;
2459
2460        lseek(fd, header->feat_offset, SEEK_SET);
2461
2462        err = perf_header__getbuffer64(header, fd, feat_sec, sec_size);
2463        if (err < 0)
2464                goto out_free;
2465
2466        for_each_set_bit(feat, header->adds_features, HEADER_LAST_FEATURE) {
2467                err = process(sec++, header, feat, fd, data);
2468                if (err < 0)
2469                        goto out_free;
2470        }
2471        err = 0;
2472out_free:
2473        free(feat_sec);
2474        return err;
2475}
2476
2477static const int attr_file_abi_sizes[] = {
2478        [0] = PERF_ATTR_SIZE_VER0,
2479        [1] = PERF_ATTR_SIZE_VER1,
2480        [2] = PERF_ATTR_SIZE_VER2,
2481        [3] = PERF_ATTR_SIZE_VER3,
2482        [4] = PERF_ATTR_SIZE_VER4,
2483        0,
2484};
2485
2486/*
2487 * In the legacy file format, the magic number is not used to encode endianness.
2488 * hdr_sz was used to encode endianness. But given that hdr_sz can vary based
2489 * on ABI revisions, we need to try all combinations for all endianness to
2490 * detect the endianness.
2491 */
2492static int try_all_file_abis(uint64_t hdr_sz, struct perf_header *ph)
2493{
2494        uint64_t ref_size, attr_size;
2495        int i;
2496
2497        for (i = 0 ; attr_file_abi_sizes[i]; i++) {
2498                ref_size = attr_file_abi_sizes[i]
2499                         + sizeof(struct perf_file_section);
2500                if (hdr_sz != ref_size) {
2501                        attr_size = bswap_64(hdr_sz);
2502                        if (attr_size != ref_size)
2503                                continue;
2504
2505                        ph->needs_swap = true;
2506                }
2507                pr_debug("ABI%d perf.data file detected, need_swap=%d\n",
2508                         i,
2509                         ph->needs_swap);
2510                return 0;
2511        }
2512        /* could not determine endianness */
2513        return -1;
2514}
2515
2516#define PERF_PIPE_HDR_VER0      16
2517
2518static const size_t attr_pipe_abi_sizes[] = {
2519        [0] = PERF_PIPE_HDR_VER0,
2520        0,
2521};
2522
2523/*
2524 * In the legacy pipe format, there is an implicit assumption that endiannesss
2525 * between host recording the samples, and host parsing the samples is the
2526 * same. This is not always the case given that the pipe output may always be
2527 * redirected into a file and analyzed on a different machine with possibly a
2528 * different endianness and perf_event ABI revsions in the perf tool itself.
2529 */
2530static int try_all_pipe_abis(uint64_t hdr_sz, struct perf_header *ph)
2531{
2532        u64 attr_size;
2533        int i;
2534
2535        for (i = 0 ; attr_pipe_abi_sizes[i]; i++) {
2536                if (hdr_sz != attr_pipe_abi_sizes[i]) {
2537                        attr_size = bswap_64(hdr_sz);
2538                        if (attr_size != hdr_sz)
2539                                continue;
2540
2541                        ph->needs_swap = true;
2542                }
2543                pr_debug("Pipe ABI%d perf.data file detected\n", i);
2544                return 0;
2545        }
2546        return -1;
2547}
2548
2549bool is_perf_magic(u64 magic)
2550{
2551        if (!memcmp(&magic, __perf_magic1, sizeof(magic))
2552                || magic == __perf_magic2
2553                || magic == __perf_magic2_sw)
2554                return true;
2555
2556        return false;
2557}
2558
2559static int check_magic_endian(u64 magic, uint64_t hdr_sz,
2560                              bool is_pipe, struct perf_header *ph)
2561{
2562        int ret;
2563
2564        /* check for legacy format */
2565        ret = memcmp(&magic, __perf_magic1, sizeof(magic));
2566        if (ret == 0) {
2567                ph->version = PERF_HEADER_VERSION_1;
2568                pr_debug("legacy perf.data format\n");
2569                if (is_pipe)
2570                        return try_all_pipe_abis(hdr_sz, ph);
2571
2572                return try_all_file_abis(hdr_sz, ph);
2573        }
2574        /*
2575         * the new magic number serves two purposes:
2576         * - unique number to identify actual perf.data files
2577         * - encode endianness of file
2578         */
2579        ph->version = PERF_HEADER_VERSION_2;
2580
2581        /* check magic number with one endianness */
2582        if (magic == __perf_magic2)
2583                return 0;
2584
2585        /* check magic number with opposite endianness */
2586        if (magic != __perf_magic2_sw)
2587                return -1;
2588
2589        ph->needs_swap = true;
2590
2591        return 0;
2592}
2593
2594int perf_file_header__read(struct perf_file_header *header,
2595                           struct perf_header *ph, int fd)
2596{
2597        ssize_t ret;
2598
2599        lseek(fd, 0, SEEK_SET);
2600
2601        ret = readn(fd, header, sizeof(*header));
2602        if (ret <= 0)
2603                return -1;
2604
2605        if (check_magic_endian(header->magic,
2606                               header->attr_size, false, ph) < 0) {
2607                pr_debug("magic/endian check failed\n");
2608                return -1;
2609        }
2610
2611        if (ph->needs_swap) {
2612                mem_bswap_64(header, offsetof(struct perf_file_header,
2613                             adds_features));
2614        }
2615
2616        if (header->size != sizeof(*header)) {
2617                /* Support the previous format */
2618                if (header->size == offsetof(typeof(*header), adds_features))
2619                        bitmap_zero(header->adds_features, HEADER_FEAT_BITS);
2620                else
2621                        return -1;
2622        } else if (ph->needs_swap) {
2623                /*
2624                 * feature bitmap is declared as an array of unsigned longs --
2625                 * not good since its size can differ between the host that
2626                 * generated the data file and the host analyzing the file.
2627                 *
2628                 * We need to handle endianness, but we don't know the size of
2629                 * the unsigned long where the file was generated. Take a best
2630                 * guess at determining it: try 64-bit swap first (ie., file
2631                 * created on a 64-bit host), and check if the hostname feature
2632                 * bit is set (this feature bit is forced on as of fbe96f2).
2633                 * If the bit is not, undo the 64-bit swap and try a 32-bit
2634                 * swap. If the hostname bit is still not set (e.g., older data
2635                 * file), punt and fallback to the original behavior --
2636                 * clearing all feature bits and setting buildid.
2637                 */
2638                mem_bswap_64(&header->adds_features,
2639                            BITS_TO_U64(HEADER_FEAT_BITS));
2640
2641                if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
2642                        /* unswap as u64 */
2643                        mem_bswap_64(&header->adds_features,
2644                                    BITS_TO_U64(HEADER_FEAT_BITS));
2645
2646                        /* unswap as u32 */
2647                        mem_bswap_32(&header->adds_features,
2648                                    BITS_TO_U32(HEADER_FEAT_BITS));
2649                }
2650
2651                if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
2652                        bitmap_zero(header->adds_features, HEADER_FEAT_BITS);
2653                        set_bit(HEADER_BUILD_ID, header->adds_features);
2654                }
2655        }
2656
2657        memcpy(&ph->adds_features, &header->adds_features,
2658               sizeof(ph->adds_features));
2659
2660        ph->data_offset  = header->data.offset;
2661        ph->data_size    = header->data.size;
2662        ph->feat_offset  = header->data.offset + header->data.size;
2663        return 0;
2664}
2665
2666static int perf_file_section__process(struct perf_file_section *section,
2667                                      struct perf_header *ph,
2668                                      int feat, int fd, void *data)
2669{
2670        if (lseek(fd, section->offset, SEEK_SET) == (off_t)-1) {
2671                pr_debug("Failed to lseek to %" PRIu64 " offset for feature "
2672                          "%d, continuing...\n", section->offset, feat);
2673                return 0;
2674        }
2675
2676        if (feat >= HEADER_LAST_FEATURE) {
2677                pr_debug("unknown feature %d, continuing...\n", feat);
2678                return 0;
2679        }
2680
2681        if (!feat_ops[feat].process)
2682                return 0;
2683
2684        return feat_ops[feat].process(section, ph, fd, data);
2685}
2686
2687static int perf_file_header__read_pipe(struct perf_pipe_file_header *header,
2688                                       struct perf_header *ph, int fd,
2689                                       bool repipe)
2690{
2691        ssize_t ret;
2692
2693        ret = readn(fd, header, sizeof(*header));
2694        if (ret <= 0)
2695                return -1;
2696
2697        if (check_magic_endian(header->magic, header->size, true, ph) < 0) {
2698                pr_debug("endian/magic failed\n");
2699                return -1;
2700        }
2701
2702        if (ph->needs_swap)
2703                header->size = bswap_64(header->size);
2704
2705        if (repipe && do_write(STDOUT_FILENO, header, sizeof(*header)) < 0)
2706                return -1;
2707
2708        return 0;
2709}
2710
2711static int perf_header__read_pipe(struct perf_session *session)
2712{
2713        struct perf_header *header = &session->header;
2714        struct perf_pipe_file_header f_header;
2715
2716        if (perf_file_header__read_pipe(&f_header, header,
2717                                        perf_data_file__fd(session->file),
2718                                        session->repipe) < 0) {
2719                pr_debug("incompatible file format\n");
2720                return -EINVAL;
2721        }
2722
2723        return 0;
2724}
2725
2726static int read_attr(int fd, struct perf_header *ph,
2727                     struct perf_file_attr *f_attr)
2728{
2729        struct perf_event_attr *attr = &f_attr->attr;
2730        size_t sz, left;
2731        size_t our_sz = sizeof(f_attr->attr);
2732        ssize_t ret;
2733
2734        memset(f_attr, 0, sizeof(*f_attr));
2735
2736        /* read minimal guaranteed structure */
2737        ret = readn(fd, attr, PERF_ATTR_SIZE_VER0);
2738        if (ret <= 0) {
2739                pr_debug("cannot read %d bytes of header attr\n",
2740                         PERF_ATTR_SIZE_VER0);
2741                return -1;
2742        }
2743
2744        /* on file perf_event_attr size */
2745        sz = attr->size;
2746
2747        if (ph->needs_swap)
2748                sz = bswap_32(sz);
2749
2750        if (sz == 0) {
2751                /* assume ABI0 */
2752                sz =  PERF_ATTR_SIZE_VER0;
2753        } else if (sz > our_sz) {
2754                pr_debug("file uses a more recent and unsupported ABI"
2755                         " (%zu bytes extra)\n", sz - our_sz);
2756                return -1;
2757        }
2758        /* what we have not yet read and that we know about */
2759        left = sz - PERF_ATTR_SIZE_VER0;
2760        if (left) {
2761                void *ptr = attr;
2762                ptr += PERF_ATTR_SIZE_VER0;
2763
2764                ret = readn(fd, ptr, left);
2765        }
2766        /* read perf_file_section, ids are read in caller */
2767        ret = readn(fd, &f_attr->ids, sizeof(f_attr->ids));
2768
2769        return ret <= 0 ? -1 : 0;
2770}
2771
2772static int perf_evsel__prepare_tracepoint_event(struct perf_evsel *evsel,
2773                                                struct pevent *pevent)
2774{
2775        struct event_format *event;
2776        char bf[128];
2777
2778        /* already prepared */
2779        if (evsel->tp_format)
2780                return 0;
2781
2782        if (pevent == NULL) {
2783                pr_debug("broken or missing trace data\n");
2784                return -1;
2785        }
2786
2787        event = pevent_find_event(pevent, evsel->attr.config);
2788        if (event == NULL)
2789                return -1;
2790
2791        if (!evsel->name) {
2792                snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name);
2793                evsel->name = strdup(bf);
2794                if (evsel->name == NULL)
2795                        return -1;
2796        }
2797
2798        evsel->tp_format = event;
2799        return 0;
2800}
2801
2802static int perf_evlist__prepare_tracepoint_events(struct perf_evlist *evlist,
2803                                                  struct pevent *pevent)
2804{
2805        struct perf_evsel *pos;
2806
2807        evlist__for_each_entry(evlist, pos) {
2808                if (pos->attr.type == PERF_TYPE_TRACEPOINT &&
2809                    perf_evsel__prepare_tracepoint_event(pos, pevent))
2810                        return -1;
2811        }
2812
2813        return 0;
2814}
2815
2816int perf_session__read_header(struct perf_session *session)
2817{
2818        struct perf_data_file *file = session->file;
2819        struct perf_header *header = &session->header;
2820        struct perf_file_header f_header;
2821        struct perf_file_attr   f_attr;
2822        u64                     f_id;
2823        int nr_attrs, nr_ids, i, j;
2824        int fd = perf_data_file__fd(file);
2825
2826        session->evlist = perf_evlist__new();
2827        if (session->evlist == NULL)
2828                return -ENOMEM;
2829
2830        session->evlist->env = &header->env;
2831        session->machines.host.env = &header->env;
2832        if (perf_data_file__is_pipe(file))
2833                return perf_header__read_pipe(session);
2834
2835        if (perf_file_header__read(&f_header, header, fd) < 0)
2836                return -EINVAL;
2837
2838        /*
2839         * Sanity check that perf.data was written cleanly; data size is
2840         * initialized to 0 and updated only if the on_exit function is run.
2841         * If data size is still 0 then the file contains only partial
2842         * information.  Just warn user and process it as much as it can.
2843         */
2844        if (f_header.data.size == 0) {
2845                pr_warning("WARNING: The %s file's data size field is 0 which is unexpected.\n"
2846                           "Was the 'perf record' command properly terminated?\n",
2847                           file->path);
2848        }
2849
2850        nr_attrs = f_header.attrs.size / f_header.attr_size;
2851        lseek(fd, f_header.attrs.offset, SEEK_SET);
2852
2853        for (i = 0; i < nr_attrs; i++) {
2854                struct perf_evsel *evsel;
2855                off_t tmp;
2856
2857                if (read_attr(fd, header, &f_attr) < 0)
2858                        goto out_errno;
2859
2860                if (header->needs_swap) {
2861                        f_attr.ids.size   = bswap_64(f_attr.ids.size);
2862                        f_attr.ids.offset = bswap_64(f_attr.ids.offset);
2863                        perf_event__attr_swap(&f_attr.attr);
2864                }
2865
2866                tmp = lseek(fd, 0, SEEK_CUR);
2867                evsel = perf_evsel__new(&f_attr.attr);
2868
2869                if (evsel == NULL)
2870                        goto out_delete_evlist;
2871
2872                evsel->needs_swap = header->needs_swap;
2873                /*
2874                 * Do it before so that if perf_evsel__alloc_id fails, this
2875                 * entry gets purged too at perf_evlist__delete().
2876                 */
2877                perf_evlist__add(session->evlist, evsel);
2878
2879                nr_ids = f_attr.ids.size / sizeof(u64);
2880                /*
2881                 * We don't have the cpu and thread maps on the header, so
2882                 * for allocating the perf_sample_id table we fake 1 cpu and
2883                 * hattr->ids threads.
2884                 */
2885                if (perf_evsel__alloc_id(evsel, 1, nr_ids))
2886                        goto out_delete_evlist;
2887
2888                lseek(fd, f_attr.ids.offset, SEEK_SET);
2889
2890                for (j = 0; j < nr_ids; j++) {
2891                        if (perf_header__getbuffer64(header, fd, &f_id, sizeof(f_id)))
2892                                goto out_errno;
2893
2894                        perf_evlist__id_add(session->evlist, evsel, 0, j, f_id);
2895                }
2896
2897                lseek(fd, tmp, SEEK_SET);
2898        }
2899
2900        symbol_conf.nr_events = nr_attrs;
2901
2902        perf_header__process_sections(header, fd, &session->tevent,
2903                                      perf_file_section__process);
2904
2905        if (perf_evlist__prepare_tracepoint_events(session->evlist,
2906                                                   session->tevent.pevent))
2907                goto out_delete_evlist;
2908
2909        return 0;
2910out_errno:
2911        return -errno;
2912
2913out_delete_evlist:
2914        perf_evlist__delete(session->evlist);
2915        session->evlist = NULL;
2916        return -ENOMEM;
2917}
2918
2919int perf_event__synthesize_attr(struct perf_tool *tool,
2920                                struct perf_event_attr *attr, u32 ids, u64 *id,
2921                                perf_event__handler_t process)
2922{
2923        union perf_event *ev;
2924        size_t size;
2925        int err;
2926
2927        size = sizeof(struct perf_event_attr);
2928        size = PERF_ALIGN(size, sizeof(u64));
2929        size += sizeof(struct perf_event_header);
2930        size += ids * sizeof(u64);
2931
2932        ev = malloc(size);
2933
2934        if (ev == NULL)
2935                return -ENOMEM;
2936
2937        ev->attr.attr = *attr;
2938        memcpy(ev->attr.id, id, ids * sizeof(u64));
2939
2940        ev->attr.header.type = PERF_RECORD_HEADER_ATTR;
2941        ev->attr.header.size = (u16)size;
2942
2943        if (ev->attr.header.size == size)
2944                err = process(tool, ev, NULL, NULL);
2945        else
2946                err = -E2BIG;
2947
2948        free(ev);
2949
2950        return err;
2951}
2952
2953static struct event_update_event *
2954event_update_event__new(size_t size, u64 type, u64 id)
2955{
2956        struct event_update_event *ev;
2957
2958        size += sizeof(*ev);
2959        size  = PERF_ALIGN(size, sizeof(u64));
2960
2961        ev = zalloc(size);
2962        if (ev) {
2963                ev->header.type = PERF_RECORD_EVENT_UPDATE;
2964                ev->header.size = (u16)size;
2965                ev->type = type;
2966                ev->id = id;
2967        }
2968        return ev;
2969}
2970
2971int
2972perf_event__synthesize_event_update_unit(struct perf_tool *tool,
2973                                         struct perf_evsel *evsel,
2974                                         perf_event__handler_t process)
2975{
2976        struct event_update_event *ev;
2977        size_t size = strlen(evsel->unit);
2978        int err;
2979
2980        ev = event_update_event__new(size + 1, PERF_EVENT_UPDATE__UNIT, evsel->id[0]);
2981        if (ev == NULL)
2982                return -ENOMEM;
2983
2984        strncpy(ev->data, evsel->unit, size);
2985        err = process(tool, (union perf_event *)ev, NULL, NULL);
2986        free(ev);
2987        return err;
2988}
2989
2990int
2991perf_event__synthesize_event_update_scale(struct perf_tool *tool,
2992                                          struct perf_evsel *evsel,
2993                                          perf_event__handler_t process)
2994{
2995        struct event_update_event *ev;
2996        struct event_update_event_scale *ev_data;
2997        int err;
2998
2999        ev = event_update_event__new(sizeof(*ev_data), PERF_EVENT_UPDATE__SCALE, evsel->id[0]);
3000        if (ev == NULL)
3001                return -ENOMEM;
3002
3003        ev_data = (struct event_update_event_scale *) ev->data;
3004        ev_data->scale = evsel->scale;
3005        err = process(tool, (union perf_event*) ev, NULL, NULL);
3006        free(ev);
3007        return err;
3008}
3009
3010int
3011perf_event__synthesize_event_update_name(struct perf_tool *tool,
3012                                         struct perf_evsel *evsel,
3013                                         perf_event__handler_t process)
3014{
3015        struct event_update_event *ev;
3016        size_t len = strlen(evsel->name);
3017        int err;
3018
3019        ev = event_update_event__new(len + 1, PERF_EVENT_UPDATE__NAME, evsel->id[0]);
3020        if (ev == NULL)
3021                return -ENOMEM;
3022
3023        strncpy(ev->data, evsel->name, len);
3024        err = process(tool, (union perf_event*) ev, NULL, NULL);
3025        free(ev);
3026        return err;
3027}
3028
3029int
3030perf_event__synthesize_event_update_cpus(struct perf_tool *tool,
3031                                        struct perf_evsel *evsel,
3032                                        perf_event__handler_t process)
3033{
3034        size_t size = sizeof(struct event_update_event);
3035        struct event_update_event *ev;
3036        int max, err;
3037        u16 type;
3038
3039        if (!evsel->own_cpus)
3040                return 0;
3041
3042        ev = cpu_map_data__alloc(evsel->own_cpus, &size, &type, &max);
3043        if (!ev)
3044                return -ENOMEM;
3045
3046        ev->header.type = PERF_RECORD_EVENT_UPDATE;
3047        ev->header.size = (u16)size;
3048        ev->type = PERF_EVENT_UPDATE__CPUS;
3049        ev->id   = evsel->id[0];
3050
3051        cpu_map_data__synthesize((struct cpu_map_data *) ev->data,
3052                                 evsel->own_cpus,
3053                                 type, max);
3054
3055        err = process(tool, (union perf_event*) ev, NULL, NULL);
3056        free(ev);
3057        return err;
3058}
3059
3060size_t perf_event__fprintf_event_update(union perf_event *event, FILE *fp)
3061{
3062        struct event_update_event *ev = &event->event_update;
3063        struct event_update_event_scale *ev_scale;
3064        struct event_update_event_cpus *ev_cpus;
3065        struct cpu_map *map;
3066        size_t ret;
3067
3068        ret = fprintf(fp, "\n... id:    %" PRIu64 "\n", ev->id);
3069
3070        switch (ev->type) {
3071        case PERF_EVENT_UPDATE__SCALE:
3072                ev_scale = (struct event_update_event_scale *) ev->data;
3073                ret += fprintf(fp, "... scale: %f\n", ev_scale->scale);
3074                break;
3075        case PERF_EVENT_UPDATE__UNIT:
3076                ret += fprintf(fp, "... unit:  %s\n", ev->data);
3077                break;
3078        case PERF_EVENT_UPDATE__NAME:
3079                ret += fprintf(fp, "... name:  %s\n", ev->data);
3080                break;
3081        case PERF_EVENT_UPDATE__CPUS:
3082                ev_cpus = (struct event_update_event_cpus *) ev->data;
3083                ret += fprintf(fp, "... ");
3084
3085                map = cpu_map__new_data(&ev_cpus->cpus);
3086                if (map)
3087                        ret += cpu_map__fprintf(map, fp);
3088                else
3089                        ret += fprintf(fp, "failed to get cpus\n");
3090                break;
3091        default:
3092                ret += fprintf(fp, "... unknown type\n");
3093                break;
3094        }
3095
3096        return ret;
3097}
3098
3099int perf_event__synthesize_attrs(struct perf_tool *tool,
3100                                   struct perf_session *session,
3101                                   perf_event__handler_t process)
3102{
3103        struct perf_evsel *evsel;
3104        int err = 0;
3105
3106        evlist__for_each_entry(session->evlist, evsel) {
3107                err = perf_event__synthesize_attr(tool, &evsel->attr, evsel->ids,
3108                                                  evsel->id, process);
3109                if (err) {
3110                        pr_debug("failed to create perf header attribute\n");
3111                        return err;
3112                }
3113        }
3114
3115        return err;
3116}
3117
3118int perf_event__process_attr(struct perf_tool *tool __maybe_unused,
3119                             union perf_event *event,
3120                             struct perf_evlist **pevlist)
3121{
3122        u32 i, ids, n_ids;
3123        struct perf_evsel *evsel;
3124        struct perf_evlist *evlist = *pevlist;
3125
3126        if (evlist == NULL) {
3127                *pevlist = evlist = perf_evlist__new();
3128                if (evlist == NULL)
3129                        return -ENOMEM;
3130        }
3131
3132        evsel = perf_evsel__new(&event->attr.attr);
3133        if (evsel == NULL)
3134                return -ENOMEM;
3135
3136        perf_evlist__add(evlist, evsel);
3137
3138        ids = event->header.size;
3139        ids -= (void *)&event->attr.id - (void *)event;
3140        n_ids = ids / sizeof(u64);
3141        /*
3142         * We don't have the cpu and thread maps on the header, so
3143         * for allocating the perf_sample_id table we fake 1 cpu and
3144         * hattr->ids threads.
3145         */
3146        if (perf_evsel__alloc_id(evsel, 1, n_ids))
3147                return -ENOMEM;
3148
3149        for (i = 0; i < n_ids; i++) {
3150                perf_evlist__id_add(evlist, evsel, 0, i, event->attr.id[i]);
3151        }
3152
3153        symbol_conf.nr_events = evlist->nr_entries;
3154
3155        return 0;
3156}
3157
3158int perf_event__process_event_update(struct perf_tool *tool __maybe_unused,
3159                                     union perf_event *event,
3160                                     struct perf_evlist **pevlist)
3161{
3162        struct event_update_event *ev = &event->event_update;
3163        struct event_update_event_scale *ev_scale;
3164        struct event_update_event_cpus *ev_cpus;
3165        struct perf_evlist *evlist;
3166        struct perf_evsel *evsel;
3167        struct cpu_map *map;
3168
3169        if (!pevlist || *pevlist == NULL)
3170                return -EINVAL;
3171
3172        evlist = *pevlist;
3173
3174        evsel = perf_evlist__id2evsel(evlist, ev->id);
3175        if (evsel == NULL)
3176                return -EINVAL;
3177
3178        switch (ev->type) {
3179        case PERF_EVENT_UPDATE__UNIT:
3180                evsel->unit = strdup(ev->data);
3181                break;
3182        case PERF_EVENT_UPDATE__NAME:
3183                evsel->name = strdup(ev->data);
3184                break;
3185        case PERF_EVENT_UPDATE__SCALE:
3186                ev_scale = (struct event_update_event_scale *) ev->data;
3187                evsel->scale = ev_scale->scale;
3188        case PERF_EVENT_UPDATE__CPUS:
3189                ev_cpus = (struct event_update_event_cpus *) ev->data;
3190
3191                map = cpu_map__new_data(&ev_cpus->cpus);
3192                if (map)
3193                        evsel->own_cpus = map;
3194                else
3195                        pr_err("failed to get event_update cpus\n");
3196        default:
3197                break;
3198        }
3199
3200        return 0;
3201}
3202
3203int perf_event__synthesize_tracing_data(struct perf_tool *tool, int fd,
3204                                        struct perf_evlist *evlist,
3205                                        perf_event__handler_t process)
3206{
3207        union perf_event ev;
3208        struct tracing_data *tdata;
3209        ssize_t size = 0, aligned_size = 0, padding;
3210        int err __maybe_unused = 0;
3211
3212        /*
3213         * We are going to store the size of the data followed
3214         * by the data contents. Since the fd descriptor is a pipe,
3215         * we cannot seek back to store the size of the data once
3216         * we know it. Instead we:
3217         *
3218         * - write the tracing data to the temp file
3219         * - get/write the data size to pipe
3220         * - write the tracing data from the temp file
3221         *   to the pipe
3222         */
3223        tdata = tracing_data_get(&evlist->entries, fd, true);
3224        if (!tdata)
3225                return -1;
3226
3227        memset(&ev, 0, sizeof(ev));
3228
3229        ev.tracing_data.header.type = PERF_RECORD_HEADER_TRACING_DATA;
3230        size = tdata->size;
3231        aligned_size = PERF_ALIGN(size, sizeof(u64));
3232        padding = aligned_size - size;
3233        ev.tracing_data.header.size = sizeof(ev.tracing_data);
3234        ev.tracing_data.size = aligned_size;
3235
3236        process(tool, &ev, NULL, NULL);
3237
3238        /*
3239         * The put function will copy all the tracing data
3240         * stored in temp file to the pipe.
3241         */
3242        tracing_data_put(tdata);
3243
3244        write_padded(fd, NULL, 0, padding);
3245
3246        return aligned_size;
3247}
3248
3249int perf_event__process_tracing_data(struct perf_tool *tool __maybe_unused,
3250                                     union perf_event *event,
3251                                     struct perf_session *session)
3252{
3253        ssize_t size_read, padding, size = event->tracing_data.size;
3254        int fd = perf_data_file__fd(session->file);
3255        off_t offset = lseek(fd, 0, SEEK_CUR);
3256        char buf[BUFSIZ];
3257
3258        /* setup for reading amidst mmap */
3259        lseek(fd, offset + sizeof(struct tracing_data_event),
3260              SEEK_SET);
3261
3262        size_read = trace_report(fd, &session->tevent,
3263                                 session->repipe);
3264        padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read;
3265
3266        if (readn(fd, buf, padding) < 0) {
3267                pr_err("%s: reading input file", __func__);
3268                return -1;
3269        }
3270        if (session->repipe) {
3271                int retw = write(STDOUT_FILENO, buf, padding);
3272                if (retw <= 0 || retw != padding) {
3273                        pr_err("%s: repiping tracing data padding", __func__);
3274                        return -1;
3275                }
3276        }
3277
3278        if (size_read + padding != size) {
3279                pr_err("%s: tracing data size mismatch", __func__);
3280                return -1;
3281        }
3282
3283        perf_evlist__prepare_tracepoint_events(session->evlist,
3284                                               session->tevent.pevent);
3285
3286        return size_read + padding;
3287}
3288
3289int perf_event__synthesize_build_id(struct perf_tool *tool,
3290                                    struct dso *pos, u16 misc,
3291                                    perf_event__handler_t process,
3292                                    struct machine *machine)
3293{
3294        union perf_event ev;
3295        size_t len;
3296        int err = 0;
3297
3298        if (!pos->hit)
3299                return err;
3300
3301        memset(&ev, 0, sizeof(ev));
3302
3303        len = pos->long_name_len + 1;
3304        len = PERF_ALIGN(len, NAME_ALIGN);
3305        memcpy(&ev.build_id.build_id, pos->build_id, sizeof(pos->build_id));
3306        ev.build_id.header.type = PERF_RECORD_HEADER_BUILD_ID;
3307        ev.build_id.header.misc = misc;
3308        ev.build_id.pid = machine->pid;
3309        ev.build_id.header.size = sizeof(ev.build_id) + len;
3310        memcpy(&ev.build_id.filename, pos->long_name, pos->long_name_len);
3311
3312        err = process(tool, &ev, NULL, machine);
3313
3314        return err;
3315}
3316
3317int perf_event__process_build_id(struct perf_tool *tool __maybe_unused,
3318                                 union perf_event *event,
3319                                 struct perf_session *session)
3320{
3321        __event_process_build_id(&event->build_id,
3322                                 event->build_id.filename,
3323                                 session);
3324        return 0;
3325}
3326