lkml.org 
[lkml]   [2015]   [Apr]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 06/22] perf bpf: check swap according to EHDR.
    Date
    Check endianess according to EHDR to support loading eBPF objects into
    big endian machines. Code is taken from util/symbol-elf.c.

    Signed-off-by: Wang Nan <wangnan0@huawei.com>
    ---
    tools/perf/util/bpf-loader.c | 28 ++++++++++++++++++++++++++++
    tools/perf/util/bpf-loader.h | 1 +
    2 files changed, 29 insertions(+)

    diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
    index 3eb7504..14d76f6 100644
    --- a/tools/perf/util/bpf-loader.c
    +++ b/tools/perf/util/bpf-loader.c
    @@ -76,6 +76,7 @@ static struct bpf_obj *bpf_obj_alloc(const char *path)
    if (!obj)
    goto out;

    + obj->needs_swap = false;
    obj->elf.fd = -1;
    return obj;
    out:
    @@ -131,6 +132,31 @@ errout:
    return err;
    }

    +static int
    +bpf_obj_swap_init(struct bpf_obj *obj)
    +{
    + static unsigned int const endian = 1;
    +
    + obj->needs_swap = false;
    +
    + switch (obj->elf.ehdr.e_ident[EI_DATA]) {
    + case ELFDATA2LSB:
    + /* We are big endian, BPF obj is little endian. */
    + if (*(unsigned char const *)&endian != 1)
    + obj->needs_swap = true;
    + return 0;
    +
    + case ELFDATA2MSB:
    + /* We are little endian, BPF obj is big endian. */
    + if (*(unsigned char const *)&endian != 0)
    + obj->needs_swap = true;
    + return 0;
    +
    + default:
    + return -EINVAL;
    + }
    +}
    +
    int bpf__load(const char *path)
    {
    struct bpf_obj *obj;
    @@ -151,6 +177,8 @@ int bpf__load(const char *path)

    if ((err = bpf_obj_elf_init(obj)))
    goto out;
    + if ((err = bpf_obj_swap_init(obj)))
    + goto out;

    list_add(&obj->list, &bpf_obj_list);
    return 0;
    diff --git a/tools/perf/util/bpf-loader.h b/tools/perf/util/bpf-loader.h
    index 6a6651b..c27b0ac 100644
    --- a/tools/perf/util/bpf-loader.h
    +++ b/tools/perf/util/bpf-loader.h
    @@ -22,6 +22,7 @@ struct bpf_obj {
    /* All bpf objs should be linked together. */
    struct list_head list;
    char *path;
    + bool needs_swap;

    /*
    * Information when doing elf related work. Only valid if fd
    --
    1.8.3.4


    \
     
     \ /
      Last update: 2015-04-30 13:21    [W:4.396 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site