From: David Ahern <dsahern@gmail.com>
To: Jiri Olsa <jolsa@redhat.com>
Cc: acme@redhat.com, a.p.zijlstra@chello.nl, mingo@elte.hu,
paulus@samba.org, cjashfor@linux.vnet.ibm.com,
fweisbec@gmail.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/7] perf, tool: Handle different endians properly during symbol load
Date: Mon, 21 May 2012 21:26:41 -0600 [thread overview]
Message-ID: <4FBB0771.1010009@gmail.com> (raw)
In-Reply-To: <1337151548-2396-2-git-send-email-jolsa@redhat.com>
On 5/16/12 12:59 AM, Jiri Olsa wrote:
> Currently we dont care about the file object's endianness. It's possible
> we read buildid file object from different architecture than we are
> currentlly running on. So we need to care about properly reading such
> object's data - handle different endianness properly.
>
> Adding:
> needs_swap DSO field
> dso__swap_init function to initialize DSO's needs_swap
> DSO__READ to read the data with proper swaps
>
> Note, running following to test perf endianity handling:
> test 1)
> - origin system:
> # perf record -a -- sleep 10 (any perf record will do)
> # perf report> report.origin
> # perf archive perf.data
>
> - copy the perf.data, report.origin and perf.data.tar.bz2
> to a target system and run:
> # tar xjvf perf.data.tar.bz2 -C ~/.debug
> # perf report> report.target
> # diff -u report.origin report.target
>
> - the diff should produce no output
> (besides some white space stuff and possibly different
> date/TZ output)
>
> test 1)
> - origin system:
> # perf record -ag -fo /tmp/perf.data -- sleep 1
> - mount origin system root to the target system on /mnt/origin
> - target system:
> # perf script --symfs /mnt/origin -I -i /mnt/origin/tmp/perf.data \
> --kallsyms /mnt/origin/proc/kallsyms
> - complete perf.data header is displayed
>
> Signed-off-by: Jiri Olsa<jolsa@redhat.com>
> ---
> tools/perf/util/symbol.c | 33 ++++++++++++++++++++++++++++++++-
> tools/perf/util/symbol.h | 30 ++++++++++++++++++++++++++++++
> 2 files changed, 62 insertions(+), 1 deletions(-)
>
> diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
> index e2ba885..04a83c5 100644
> --- a/tools/perf/util/symbol.c
> +++ b/tools/perf/util/symbol.c
> @@ -323,6 +323,7 @@ struct dso *dso__new(const char *name)
> dso->sorted_by_name = 0;
> dso->has_build_id = 0;
> dso->kernel = DSO_TYPE_USER;
> + dso->needs_swap = DSO_SWAP__UNSET;
> INIT_LIST_HEAD(&dso->node);
> }
>
> @@ -1156,6 +1157,33 @@ static size_t elf_addr_to_index(Elf *elf, GElf_Addr addr)
> return -1;
> }
>
> +static int dso__swap_init(struct dso *dso, unsigned char eidata)
> +{
> + static unsigned int const endian = 1;
> +
> + dso->needs_swap = DSO_SWAP__NO;
> +
> + switch (eidata) {
> + case ELFDATA2LSB:
> + /* We are big endian, DSO is little endian. */
> + if (*(unsigned char const *)&endian != 1)
> + dso->needs_swap = DSO_SWAP__YES;
> + break;
> +
> + case ELFDATA2MSB:
> + /* We are little endian, DSO is big endian. */
> + if (*(unsigned char const *)&endian != 0)
> + dso->needs_swap = DSO_SWAP__YES;
> + break;
> +
> + default:
> + pr_err("unrecognized DSO data encoding %d\n", eidata);
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> static int dso__load_sym(struct dso *dso, struct map *map, const char *name,
> int fd, symbol_filter_t filter, int kmodule,
> int want_symtab)
> @@ -1187,6 +1215,9 @@ static int dso__load_sym(struct dso *dso, struct map *map, const char *name,
> goto out_elf_end;
> }
>
> + if (dso__swap_init(dso, ehdr.e_ident[EI_DATA]))
> + goto out_elf_end;
> +
> /* Always reject images with a mismatched build-id: */
> if (dso->has_build_id) {
> u8 build_id[BUILD_ID_SIZE];
> @@ -1272,7 +1303,7 @@ static int dso__load_sym(struct dso *dso, struct map *map, const char *name,
> if (opdsec&& sym.st_shndx == opdidx) {
> u32 offset = sym.st_value - opdshdr.sh_addr;
> u64 *opd = opddata->d_buf + offset;
> - sym.st_value = *opd;
> + sym.st_value = DSO__READ(dso, u64, *opd);
> sym.st_shndx = elf_addr_to_index(elf, sym.st_value);
> }
>
> diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
> index 5649d63..be14744 100644
> --- a/tools/perf/util/symbol.h
> +++ b/tools/perf/util/symbol.h
> @@ -9,6 +9,7 @@
> #include<linux/list.h>
> #include<linux/rbtree.h>
> #include<stdio.h>
> +#include<byteswap.h>
>
> #ifdef HAVE_CPLUS_DEMANGLE
> extern char *cplus_demangle(const char *, int);
> @@ -160,11 +161,18 @@ enum dso_kernel_type {
> DSO_TYPE_GUEST_KERNEL
> };
>
> +enum dso_swap_type {
> + DSO_SWAP__UNSET,
> + DSO_SWAP__NO,
> + DSO_SWAP__YES,
> +};
> +
> struct dso {
> struct list_head node;
> struct rb_root symbols[MAP__NR_TYPES];
> struct rb_root symbol_names[MAP__NR_TYPES];
> enum dso_kernel_type kernel;
> + enum dso_swap_type needs_swap;
> u8 adjust_symbols:1;
> u8 has_build_id:1;
> u8 hit:1;
> @@ -182,6 +190,28 @@ struct dso {
> char name[0];
> };
>
> +#define DSO__READ(dso, type, val) \
s/DSO__READ/DSO__SWAP/? it's swapping byes, not reading.
David
next prev parent reply other threads:[~2012-05-22 3:26 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-16 6:59 [PATCHv4 0/7] perf, tool: Fix endian issues Jiri Olsa
2012-05-16 6:59 ` [PATCH 1/7] perf, tool: Handle different endians properly during symbol load Jiri Olsa
2012-05-22 3:26 ` David Ahern [this message]
2012-05-16 6:59 ` [PATCH 2/7] perf, tool: Carry perf_event_attr bitfield throught different endians Jiri Olsa
2012-05-22 3:29 ` David Ahern
2012-05-23 15:26 ` [tip:perf/core] perf tools: " tip-bot for Jiri Olsa
2012-05-16 6:59 ` [PATCH 3/7] perf, tool: Add union u64_swap type for swapping u64 data Jiri Olsa
2012-05-22 3:29 ` David Ahern
2012-05-23 15:27 ` [tip:perf/core] perf tools: " tip-bot for Jiri Olsa
2012-05-16 6:59 ` [PATCH 4/7] perf, tool: Handle endianity swap on sample_id_all header data Jiri Olsa
2012-05-22 3:35 ` David Ahern
2012-05-16 6:59 ` [PATCH 5/7] perf, tool: Fix 32 bit values endianity swap for sample_id_all header Jiri Olsa
2012-05-22 4:38 ` David Ahern
2012-05-22 15:53 ` Arnaldo Carvalho de Melo
2012-05-16 6:59 ` [PATCH 6/7] perf, tool: Fix endianity trick for adds_features bitmask Jiri Olsa
2012-05-22 4:38 ` David Ahern
2012-05-22 8:41 ` Jiri Olsa
2012-05-22 15:48 ` David Ahern
2012-05-23 17:59 ` Jiri Olsa
2012-05-24 15:32 ` David Ahern
2012-05-24 19:48 ` Jiri Olsa
2012-06-15 19:10 ` [tip:perf/urgent] perf tools: Fix endianity swapping " tip-bot for David Ahern
2012-05-16 6:59 ` [PATCH 7/7] perf, tool: Fix callchain ip printf Jiri Olsa
2012-05-21 7:39 ` [tip:perf/core] perf hists: Fix callchain ip printf format tip-bot for Jiri Olsa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FBB0771.1010009@gmail.com \
--to=dsahern@gmail.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@redhat.com \
--cc=cjashfor@linux.vnet.ibm.com \
--cc=fweisbec@gmail.com \
--cc=jolsa@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=paulus@samba.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.