Em Wed, Feb 26, 2020 at 02:03:45PM +0100, Jiri Olsa escreveu: > Adding the DSO_BINARY_TYPE__BPF_IMAGE dso binary type > to recognize bpf images that carry trampoline or dispatcher. > > Upcoming patches will add support to read the image data, > store it within the BPF feature in perf.data and display > it for annotation purposes. > > Currently we only display following message: Acked-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx> > # ./perf annotate bpf_trampoline_24456 --stdio > Percent | Source code & Disassembly of . for cycles (504 ... > --------------------------------------------------------------- ... > : to be implemented > > Signed-off-by: Jiri Olsa <jolsa@xxxxxxxxxx> > --- > tools/perf/util/annotate.c | 20 ++++++++++++++++++++ > tools/perf/util/dso.c | 1 + > tools/perf/util/dso.h | 1 + > tools/perf/util/machine.c | 11 +++++++++++ > tools/perf/util/symbol.c | 1 + > 5 files changed, 34 insertions(+) > > diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c > index ca73fb74ad03..d9e606e11936 100644 > --- a/tools/perf/util/annotate.c > +++ b/tools/perf/util/annotate.c > @@ -1843,6 +1843,24 @@ static int symbol__disassemble_bpf(struct symbol *sym __maybe_unused, > } > #endif // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT) > > +static int > +symbol__disassemble_bpf_image(struct symbol *sym, > + struct annotate_args *args) > +{ > + struct annotation *notes = symbol__annotation(sym); > + struct disasm_line *dl; > + > + args->offset = -1; > + args->line = strdup("to be implemented"); > + args->line_nr = 0; > + dl = disasm_line__new(args); > + if (dl) > + annotation_line__add(&dl->al, ¬es->src->source); > + > + free(args->line); > + return 0; > +} > + > /* > * Possibly create a new version of line with tabs expanded. Returns the > * existing or new line, storage is updated if a new line is allocated. If > @@ -1942,6 +1960,8 @@ static int symbol__disassemble(struct symbol *sym, struct annotate_args *args) > > if (dso->binary_type == DSO_BINARY_TYPE__BPF_PROG_INFO) { > return symbol__disassemble_bpf(sym, args); > + } else if (dso->binary_type == DSO_BINARY_TYPE__BPF_IMAGE) { > + return symbol__disassemble_bpf_image(sym, args); > } else if (dso__is_kcore(dso)) { > kce.kcore_filename = symfs_filename; > kce.addr = map__rip_2objdump(map, sym->start); > diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c > index 91f21239608b..f338990e0fe6 100644 > --- a/tools/perf/util/dso.c > +++ b/tools/perf/util/dso.c > @@ -191,6 +191,7 @@ int dso__read_binary_type_filename(const struct dso *dso, > case DSO_BINARY_TYPE__GUEST_KALLSYMS: > case DSO_BINARY_TYPE__JAVA_JIT: > case DSO_BINARY_TYPE__BPF_PROG_INFO: > + case DSO_BINARY_TYPE__BPF_IMAGE: > case DSO_BINARY_TYPE__NOT_FOUND: > ret = -1; > break; > diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h > index 2db64b79617a..9553a1fd9e8a 100644 > --- a/tools/perf/util/dso.h > +++ b/tools/perf/util/dso.h > @@ -40,6 +40,7 @@ enum dso_binary_type { > DSO_BINARY_TYPE__GUEST_KCORE, > DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO, > DSO_BINARY_TYPE__BPF_PROG_INFO, > + DSO_BINARY_TYPE__BPF_IMAGE, > DSO_BINARY_TYPE__NOT_FOUND, > }; > > diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c > index 463ada5117f8..372ed147bed5 100644 > --- a/tools/perf/util/machine.c > +++ b/tools/perf/util/machine.c > @@ -719,6 +719,12 @@ int machine__process_switch_event(struct machine *machine __maybe_unused, > return 0; > } > > +static int is_bpf_image(const char *name) > +{ > + return strncmp(name, "bpf_trampoline_", sizeof("bpf_trampoline_") - 1) || > + strncmp(name, "bpf_dispatcher_", sizeof("bpf_dispatcher_") - 1); > +} > + > static int machine__process_ksymbol_register(struct machine *machine, > union perf_event *event, > struct perf_sample *sample __maybe_unused) > @@ -743,6 +749,11 @@ static int machine__process_ksymbol_register(struct machine *machine, > map->end = map->start + event->ksymbol.len; > maps__insert(&machine->kmaps, map); > dso__set_loaded(dso); > + > + if (is_bpf_image(event->ksymbol.name)) { > + dso->binary_type = DSO_BINARY_TYPE__BPF_IMAGE; > + dso__set_long_name(dso, "", false); > + } > } > > sym = symbol__new(map->map_ip(map, map->start), > diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c > index 3b379b1296f1..e6caec4b6054 100644 > --- a/tools/perf/util/symbol.c > +++ b/tools/perf/util/symbol.c > @@ -1537,6 +1537,7 @@ static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod, > return true; > > case DSO_BINARY_TYPE__BPF_PROG_INFO: > + case DSO_BINARY_TYPE__BPF_IMAGE: > case DSO_BINARY_TYPE__NOT_FOUND: > default: > return false; > -- > 2.24.1