|
@@ -481,6 +481,38 @@ static void perf_event__read_swap(union perf_event *event)
|
|
|
event->read.id = bswap_64(event->read.id);
|
|
|
}
|
|
|
|
|
|
+static u8 revbyte(u8 b)
|
|
|
+{
|
|
|
+ int rev = (b >> 4) | ((b & 0xf) << 4);
|
|
|
+ rev = ((rev & 0xcc) >> 2) | ((rev & 0x33) << 2);
|
|
|
+ rev = ((rev & 0xaa) >> 1) | ((rev & 0x55) << 1);
|
|
|
+ return (u8) rev;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * XXX this is hack in attempt to carry flags bitfield
|
|
|
+ * throught endian village. ABI says:
|
|
|
+ *
|
|
|
+ * Bit-fields are allocated from right to left (least to most significant)
|
|
|
+ * on little-endian implementations and from left to right (most to least
|
|
|
+ * significant) on big-endian implementations.
|
|
|
+ *
|
|
|
+ * The above seems to be byte specific, so we need to reverse each
|
|
|
+ * byte of the bitfield. 'Internet' also says this might be implementation
|
|
|
+ * specific and we probably need proper fix and carry perf_event_attr
|
|
|
+ * bitfield flags in separate data file FEAT_ section. Thought this seems
|
|
|
+ * to work for now.
|
|
|
+ */
|
|
|
+static void swap_bitfield(u8 *p, unsigned len)
|
|
|
+{
|
|
|
+ unsigned i;
|
|
|
+
|
|
|
+ for (i = 0; i < len; i++) {
|
|
|
+ *p = revbyte(*p);
|
|
|
+ p++;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/* exported for swapping attributes in file header */
|
|
|
void perf_event__attr_swap(struct perf_event_attr *attr)
|
|
|
{
|
|
@@ -494,6 +526,8 @@ void perf_event__attr_swap(struct perf_event_attr *attr)
|
|
|
attr->bp_type = bswap_32(attr->bp_type);
|
|
|
attr->bp_addr = bswap_64(attr->bp_addr);
|
|
|
attr->bp_len = bswap_64(attr->bp_len);
|
|
|
+
|
|
|
+ swap_bitfield((u8 *) (&attr->read_format + 1), sizeof(u64));
|
|
|
}
|
|
|
|
|
|
static void perf_event__hdr_attr_swap(union perf_event *event)
|