perf tools: Fix cross-endian analysis
authorDavid Ahern <david.ahern@oracle.com>
Thu, 9 Apr 2015 20:15:46 +0000 (16:15 -0400)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 10 Apr 2015 13:13:58 +0000 (10:13 -0300)
Trying to analyze a big endian data file on little endian system fails
with the error:

  0xa9b40 [0x70]: failed to process type: 9

The problem is that header parsing is not done correctly because the
file attributes are not swapped. Make it so. With this patch able to
analyze a sparc64 data file on x86_64.

Signed-off-by: David Ahern <david.ahern@oracle.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/1428610546-178789-1-git-send-email-david.ahern@oracle.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/header.c

index fff3b2a455aebffce28bcc96e3d6fa9d9f4968e2..918fd8ae2d80bca007a8b6f7e2f8488fed0771a3 100644 (file)
@@ -2504,8 +2504,11 @@ int perf_session__read_header(struct perf_session *session)
                if (read_attr(fd, header, &f_attr) < 0)
                        goto out_errno;
 
-               if (header->needs_swap)
+               if (header->needs_swap) {
+                       f_attr.ids.size   = bswap_64(f_attr.ids.size);
+                       f_attr.ids.offset = bswap_64(f_attr.ids.offset);
                        perf_event__attr_swap(&f_attr.attr);
+               }
 
                tmp = lseek(fd, 0, SEEK_CUR);
                evsel = perf_evsel__new(&f_attr.attr);