cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

builtin-buildid-list.c (3276B)


      1/*
      2 * builtin-buildid-list.c
      3 *
      4 * Builtin buildid-list command: list buildids in perf.data, in the running
      5 * kernel and in ELF files.
      6 *
      7 * Copyright (C) 2009, Red Hat Inc.
      8 * Copyright (C) 2009, Arnaldo Carvalho de Melo <acme@redhat.com>
      9 */
     10#include "builtin.h"
     11#include "perf.h"
     12#include "util/build-id.h"
     13#include "util/debug.h"
     14#include "util/dso.h"
     15#include <subcmd/pager.h>
     16#include <subcmd/parse-options.h>
     17#include "util/session.h"
     18#include "util/symbol.h"
     19#include "util/data.h"
     20#include <errno.h>
     21#include <linux/err.h>
     22
     23static int sysfs__fprintf_build_id(FILE *fp)
     24{
     25	char sbuild_id[SBUILD_ID_SIZE];
     26	int ret;
     27
     28	ret = sysfs__sprintf_build_id("/", sbuild_id);
     29	if (ret != sizeof(sbuild_id))
     30		return ret < 0 ? ret : -EINVAL;
     31
     32	return fprintf(fp, "%s\n", sbuild_id);
     33}
     34
     35static int filename__fprintf_build_id(const char *name, FILE *fp)
     36{
     37	char sbuild_id[SBUILD_ID_SIZE];
     38	int ret;
     39
     40	ret = filename__sprintf_build_id(name, sbuild_id);
     41	if (ret != sizeof(sbuild_id))
     42		return ret < 0 ? ret : -EINVAL;
     43
     44	return fprintf(fp, "%s\n", sbuild_id);
     45}
     46
     47static bool dso__skip_buildid(struct dso *dso, int with_hits)
     48{
     49	return with_hits && !dso->hit;
     50}
     51
     52static int perf_session__list_build_ids(bool force, bool with_hits)
     53{
     54	struct perf_session *session;
     55	struct perf_data data = {
     56		.path  = input_name,
     57		.mode  = PERF_DATA_MODE_READ,
     58		.force = force,
     59	};
     60
     61	symbol__elf_init();
     62	/*
     63	 * See if this is an ELF file first:
     64	 */
     65	if (filename__fprintf_build_id(input_name, stdout) > 0)
     66		goto out;
     67
     68	session = perf_session__new(&data, &build_id__mark_dso_hit_ops);
     69	if (IS_ERR(session))
     70		return PTR_ERR(session);
     71
     72	/*
     73	 * We take all buildids when the file contains AUX area tracing data
     74	 * because we do not decode the trace because it would take too long.
     75	 */
     76	if (!perf_data__is_pipe(&data) &&
     77	    perf_header__has_feat(&session->header, HEADER_AUXTRACE))
     78		with_hits = false;
     79
     80	if (!perf_header__has_feat(&session->header, HEADER_BUILD_ID))
     81		with_hits = true;
     82
     83	if (zstd_init(&(session->zstd_data), 0) < 0)
     84		pr_warning("Decompression initialization failed. Reported data may be incomplete.\n");
     85
     86	/*
     87	 * in pipe-mode, the only way to get the buildids is to parse
     88	 * the record stream. Buildids are stored as RECORD_HEADER_BUILD_ID
     89	 */
     90	if (with_hits || perf_data__is_pipe(&data))
     91		perf_session__process_events(session);
     92
     93	perf_session__fprintf_dsos_buildid(session, stdout, dso__skip_buildid, with_hits);
     94	perf_session__delete(session);
     95out:
     96	return 0;
     97}
     98
     99int cmd_buildid_list(int argc, const char **argv)
    100{
    101	bool show_kernel = false;
    102	bool with_hits = false;
    103	bool force = false;
    104	const struct option options[] = {
    105	OPT_BOOLEAN('H', "with-hits", &with_hits, "Show only DSOs with hits"),
    106	OPT_STRING('i', "input", &input_name, "file", "input file name"),
    107	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
    108	OPT_BOOLEAN('k', "kernel", &show_kernel, "Show current kernel build id"),
    109	OPT_INCR('v', "verbose", &verbose, "be more verbose"),
    110	OPT_END()
    111	};
    112	const char * const buildid_list_usage[] = {
    113		"perf buildid-list [<options>]",
    114		NULL
    115	};
    116
    117	argc = parse_options(argc, argv, options, buildid_list_usage, 0);
    118	setup_pager();
    119
    120	if (show_kernel)
    121		return !(sysfs__fprintf_build_id(stdout) > 0);
    122
    123	return perf_session__list_build_ids(force, with_hits);
    124}