lkml.org 
[lkml]   [2021]   [Jun]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH RFC 08/11] perf dlfilter: Add insn() to perf_dlfilter_fns
    Date
    Add a function, for use by dlfilters, to return instruction bytes.

    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    ---
    tools/perf/Documentation/perf-dlfilter.txt | 5 +++-
    tools/perf/util/dlfilter.c | 32 ++++++++++++++++++++++
    tools/perf/util/perf_dlfilter.h | 4 ++-
    3 files changed, 39 insertions(+), 2 deletions(-)

    diff --git a/tools/perf/Documentation/perf-dlfilter.txt b/tools/perf/Documentation/perf-dlfilter.txt
    index c3fe3bc02819..5ed64bbf084e 100644
    --- a/tools/perf/Documentation/perf-dlfilter.txt
    +++ b/tools/perf/Documentation/perf-dlfilter.txt
    @@ -110,7 +110,8 @@ struct perf_dlfilter_fns {
    const struct perf_dlfilter_al *(*resolve_ip)(void *ctx);
    const struct perf_dlfilter_al *(*resolve_addr)(void *ctx);
    __s32 (*resolve_address)(void *ctx, __u64 address, struct perf_dlfilter_al *al);
    - void *(*reserved[125])(void *);
    + const __u8 *(*insn)(void *ctx, __u32 *length);
    + void *(*reserved[124])(void *);
    };
    ----

    @@ -121,6 +122,8 @@ struct perf_dlfilter_fns {
    'resolve_address' provides information about 'address'. al->size must be set
    before calling. Returns 0 on success, -1 otherwise.

    +'insn' returns instruction bytes and length.
    +
    The perf_dlfilter_al structure
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    diff --git a/tools/perf/util/dlfilter.c b/tools/perf/util/dlfilter.c
    index 3b29bf9f2bd3..375fb01bdeb8 100644
    --- a/tools/perf/util/dlfilter.c
    +++ b/tools/perf/util/dlfilter.c
    @@ -15,6 +15,7 @@
    #include "dso.h"
    #include "map.h"
    #include "thread.h"
    +#include "trace-event.h"
    #include "symbol.h"
    #include "dlfilter.h"
    #include "perf_dlfilter.h"
    @@ -159,10 +160,41 @@ static __s32 dlfilter__resolve_address(void *ctx, __u64 address, struct perf_dlf
    return 0;
    }

    +static const __u8 *dlfilter__insn(void *ctx, __u32 *len)
    +{
    + struct dlfilter *d = (struct dlfilter *)ctx;
    +
    + if (!len)
    + return NULL;
    +
    + *len = 0;
    +
    + if (!d->ctx_valid)
    + return NULL;
    +
    + if (d->sample->ip && !d->sample->insn_len) {
    + struct addr_location *al = d->al;
    +
    + if (!al->thread && machine__resolve(d->machine, al, d->sample) < 0)
    + return NULL;
    +
    + if (al->thread->maps && al->thread->maps->machine)
    + script_fetch_insn(d->sample, al->thread, al->thread->maps->machine);
    + }
    +
    + if (!d->sample->insn_len)
    + return NULL;
    +
    + *len = d->sample->insn_len;
    +
    + return (__u8 *)d->sample->insn;
    +}
    +
    static const struct perf_dlfilter_fns perf_dlfilter_fns = {
    .resolve_ip = dlfilter__resolve_ip,
    .resolve_addr = dlfilter__resolve_addr,
    .resolve_address = dlfilter__resolve_address,
    + .insn = dlfilter__insn,
    };

    #define CHECK_FLAG(x) BUILD_BUG_ON((u64)PERF_DLFILTER_FLAG_ ## x != (u64)PERF_IP_FLAG_ ## x)
    diff --git a/tools/perf/util/perf_dlfilter.h b/tools/perf/util/perf_dlfilter.h
    index 97bceb625b54..913b773af268 100644
    --- a/tools/perf/util/perf_dlfilter.h
    +++ b/tools/perf/util/perf_dlfilter.h
    @@ -95,8 +95,10 @@ struct perf_dlfilter_fns {
    * calling). Returns 0 on success, -1 otherwise.
    */
    __s32 (*resolve_address)(void *ctx, __u64 address, struct perf_dlfilter_al *al);
    + /* Return instruction bytes and length */
    + const __u8 *(*insn)(void *ctx, __u32 *length);
    /* Reserved */
    - void *(*reserved[125])(void *);
    + void *(*reserved[124])(void *);
    };

    /*
    --
    2.17.1
    \
     
     \ /
      Last update: 2021-06-21 17:05    [W:5.668 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site