diff options
Diffstat (limited to 'tools/perf/util/session.c')
-rw-r--r-- | tools/perf/util/session.c | 34 |
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 | ||
484 | static 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 | */ | ||
506 | static 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 */ |
485 | void perf_event__attr_swap(struct perf_event_attr *attr) | 517 | void 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 | ||
499 | static void perf_event__hdr_attr_swap(union perf_event *event) | 533 | static void perf_event__hdr_attr_swap(union perf_event *event) |