]> git.itanic.dy.fi Git - linux-stable/commitdiff
perf symbols: Add kallsyms__get_symbol_start()
authorNamhyung Kim <namhyung@kernel.org>
Tue, 25 Jul 2023 00:19:28 +0000 (17:19 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 28 Jul 2023 22:01:16 +0000 (19:01 -0300)
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: Namhyung Kim <namhyung@kernel.org>
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Ian 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: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/event.c
tools/perf/util/event.h

index 4cbb092e0684c037194367f4ec7bffd1b5b48a95..923c0fb1512226a60c7a01730c405ca15e6982c9 100644 (file)
@@ -93,8 +93,8 @@ struct process_symbol_args {
        u64        start;
 };
 
-static int find_symbol_cb(void *arg, const char *name, char type,
-                         u64 start)
+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;
index de20e01c9d72affabad8ca45a18cbb340ce1036b..d8bcee2e9b93b03d77becb4c233ab51cc363997f 100644 (file)
@@ -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);