aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r--tools/perf/util/session.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 4dcc8f3190cf..17c9ace445c4 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -481,6 +481,38 @@ static void perf_event__read_swap(union perf_event *event)
481 event->read.id = bswap_64(event->read.id); 481 event->read.id = bswap_64(event->read.id);
482} 482}
483 483
484static u8 revbyte(u8 b)
485{
486 int rev = (b >> 4) | ((b & 0xf) << 4);
487 rev = ((rev & 0xcc) >> 2) | ((rev & 0x33) << 2);
488 rev = ((rev & 0xaa) >> 1) | ((rev & 0x55) << 1);
489 return (u8) rev;
490}
491
492/*
493 * XXX this is hack in attempt to carry flags bitfield
494 * throught endian village. ABI says:
495 *
496 * Bit-fields are allocated from right to left (least to most significant)
497 * on little-endian implementations and from left to right (most to least
498 * significant) on big-endian implementations.
499 *
500 * The above seems to be byte specific, so we need to reverse each
501 * byte of the bitfield. 'Internet' also says this might be implementation
502 * specific and we probably need proper fix and carry perf_event_attr
503 * bitfield flags in separate data file FEAT_ section. Thought this seems
504 * to work for now.
505 */
506static void swap_bitfield(u8 *p, unsigned len)
507{
508 unsigned i;
509
510 for (i = 0; i < len; i++) {
511 *p = revbyte(*p);
512 p++;
513 }
514}
515
484/* exported for swapping attributes in file header */ 516/* exported for swapping attributes in file header */
485void perf_event__attr_swap(struct perf_event_attr *attr) 517void perf_event__attr_swap(struct perf_event_attr *attr)
486{ 518{
@@ -494,6 +526,8 @@ void perf_event__attr_swap(struct perf_event_attr *attr)
494 attr->bp_type = bswap_32(attr->bp_type); 526 attr->bp_type = bswap_32(attr->bp_type);
495 attr->bp_addr = bswap_64(attr->bp_addr); 527 attr->bp_addr = bswap_64(attr->bp_addr);
496 attr->bp_len = bswap_64(attr->bp_len); 528 attr->bp_len = bswap_64(attr->bp_len);
529
530 swap_bitfield((u8 *) (&attr->read_format + 1), sizeof(u64));
497} 531}
498 532
499static void perf_event__hdr_attr_swap(union perf_event *event) 533static void perf_event__hdr_attr_swap(union perf_event *event)