Commit f9dd531c authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo
Browse files

perf symbols: Add kallsyms__get_symbol_start()



The kallsyms__get_symbol_start() to get any symbol address from
kallsyms.  The existing kallsyms__get_function_start() only allows text
symbols so create this to allow data symbols too.

Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Acked-by: default avatarIan Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20230725001929.368041-1-namhyung@kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 4c11adff
Loading
Loading
Loading
Loading
+27 −3
Original line number Diff line number Diff line
@@ -93,7 +93,7 @@ struct process_symbol_args {
	u64	   start;
};

static int find_symbol_cb(void *arg, const char *name, char type,
static int find_func_symbol_cb(void *arg, const char *name, char type,
			       u64 start)
{
	struct process_symbol_args *args = arg;
@@ -110,12 +110,36 @@ static int find_symbol_cb(void *arg, const char *name, char type,
	return 1;
}

static int find_any_symbol_cb(void *arg, const char *name,
			      char type __maybe_unused, u64 start)
{
	struct process_symbol_args *args = arg;

	if (strcmp(name, args->name))
		return 0;

	args->start = start;
	return 1;
}

int kallsyms__get_function_start(const char *kallsyms_filename,
				 const char *symbol_name, u64 *addr)
{
	struct process_symbol_args args = { .name = symbol_name, };

	if (kallsyms__parse(kallsyms_filename, &args, find_symbol_cb) <= 0)
	if (kallsyms__parse(kallsyms_filename, &args, find_func_symbol_cb) <= 0)
		return -1;

	*addr = args.start;
	return 0;
}

int kallsyms__get_symbol_start(const char *kallsyms_filename,
			       const char *symbol_name, u64 *addr)
{
	struct process_symbol_args args = { .name = symbol_name, };

	if (kallsyms__parse(kallsyms_filename, &args, find_any_symbol_cb) <= 0)
		return -1;

	*addr = args.start;
+2 −0
Original line number Diff line number Diff line
@@ -360,6 +360,8 @@ size_t perf_event__fprintf(union perf_event *event, struct machine *machine, FIL

int kallsyms__get_function_start(const char *kallsyms_filename,
				 const char *symbol_name, u64 *addr);
int kallsyms__get_symbol_start(const char *kallsyms_filename,
			       const char *symbol_name, u64 *addr);

void event_attr_init(struct perf_event_attr *attr);