lkml.org 
[lkml]   [2013]   [Jul]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 9/9] perf tools: allow annotation using /proc/kcore
    Date
    Annotation with /proc/kcore is possible so the logic
    is adjusted to allow it. The main difference is that
    /proc/kcore had no symbols so the parsing logic needed
    a tweak to read jump offsets.

    The other difference is that objdump cannot always
    read from kcore. That seems to be a bug with objdump.

    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    ---
    tools/perf/builtin-top.c | 3 ++-
    tools/perf/util/annotate.c | 13 +++++++++----
    2 files changed, 11 insertions(+), 5 deletions(-)

    diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
    index 0ecec5f..4585c08 100644
    --- a/tools/perf/builtin-top.c
    +++ b/tools/perf/builtin-top.c
    @@ -103,7 +103,8 @@ static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he)
    /*
    * We can't annotate with just /proc/kallsyms
    */
    - if (map->dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS) {
    + if (map->dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS &&
    + !dso__is_kcore(map->dso)) {
    pr_err("Can't annotate %s: No vmlinux file was found in the "
    "path\n", sym->name);
    sleep(1);
    diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
    index d102716..4ab2f11 100644
    --- a/tools/perf/util/annotate.c
    +++ b/tools/perf/util/annotate.c
    @@ -110,10 +110,10 @@ static int jump__parse(struct ins_operands *ops)
    {
    const char *s = strchr(ops->raw, '+');

    - ops->target.addr = strtoll(ops->raw, NULL, 16);
    + ops->target.addr = strtoull(ops->raw, NULL, 16);

    if (s++ != NULL)
    - ops->target.offset = strtoll(s, NULL, 16);
    + ops->target.offset = strtoull(s, NULL, 16);
    else
    ops->target.offset = UINT64_MAX;

    @@ -821,6 +821,10 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map,
    if (dl == NULL)
    return -1;

    + if (dl->ops.target.offset == UINT64_MAX)
    + dl->ops.target.offset = dl->ops.target.addr -
    + map__rip_2objdump(map, sym->start);
    +
    disasm__add(&notes->src->source, dl);

    return 0;
    @@ -864,7 +868,8 @@ fallback:
    free_filename = false;
    }

    - if (dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS) {
    + if (dso->symtab_type == DSO_BINARY_TYPE__KALLSYMS &&
    + !dso__is_kcore(dso)) {
    char bf[BUILD_ID_SIZE * 2 + 16] = " with build id ";
    char *build_id_msg = NULL;

    @@ -898,7 +903,7 @@ fallback:
    snprintf(command, sizeof(command),
    "%s %s%s --start-address=0x%016" PRIx64
    " --stop-address=0x%016" PRIx64
    - " -d %s %s -C %s|grep -v %s|expand",
    + " -d %s %s -C %s 2>/dev/null|grep -v %s|expand",
    objdump_path ? objdump_path : "objdump",
    disassembler_style ? "-M " : "",
    disassembler_style ? disassembler_style : "",
    --
    1.7.11.7


    \
     
     \ /
      Last update: 2013-07-25 16:21    [W:2.550 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site