|
@@ -454,37 +454,65 @@ void mem_bswap_64(void *src, int byte_size)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-static void perf_event__all64_swap(union perf_event *event)
|
|
|
|
|
|
+static void swap_sample_id_all(union perf_event *event, void *data)
|
|
|
|
+{
|
|
|
|
+ void *end = (void *) event + event->header.size;
|
|
|
|
+ int size = end - data;
|
|
|
|
+
|
|
|
|
+ BUG_ON(size % sizeof(u64));
|
|
|
|
+ mem_bswap_64(data, size);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void perf_event__all64_swap(union perf_event *event,
|
|
|
|
+ bool sample_id_all __used)
|
|
{
|
|
{
|
|
struct perf_event_header *hdr = &event->header;
|
|
struct perf_event_header *hdr = &event->header;
|
|
mem_bswap_64(hdr + 1, event->header.size - sizeof(*hdr));
|
|
mem_bswap_64(hdr + 1, event->header.size - sizeof(*hdr));
|
|
}
|
|
}
|
|
|
|
|
|
-static void perf_event__comm_swap(union perf_event *event)
|
|
|
|
|
|
+static void perf_event__comm_swap(union perf_event *event, bool sample_id_all)
|
|
{
|
|
{
|
|
event->comm.pid = bswap_32(event->comm.pid);
|
|
event->comm.pid = bswap_32(event->comm.pid);
|
|
event->comm.tid = bswap_32(event->comm.tid);
|
|
event->comm.tid = bswap_32(event->comm.tid);
|
|
|
|
+
|
|
|
|
+ if (sample_id_all) {
|
|
|
|
+ void *data = &event->comm.comm;
|
|
|
|
+
|
|
|
|
+ data += ALIGN(strlen(data) + 1, sizeof(u64));
|
|
|
|
+ swap_sample_id_all(event, data);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
-static void perf_event__mmap_swap(union perf_event *event)
|
|
|
|
|
|
+static void perf_event__mmap_swap(union perf_event *event,
|
|
|
|
+ bool sample_id_all)
|
|
{
|
|
{
|
|
event->mmap.pid = bswap_32(event->mmap.pid);
|
|
event->mmap.pid = bswap_32(event->mmap.pid);
|
|
event->mmap.tid = bswap_32(event->mmap.tid);
|
|
event->mmap.tid = bswap_32(event->mmap.tid);
|
|
event->mmap.start = bswap_64(event->mmap.start);
|
|
event->mmap.start = bswap_64(event->mmap.start);
|
|
event->mmap.len = bswap_64(event->mmap.len);
|
|
event->mmap.len = bswap_64(event->mmap.len);
|
|
event->mmap.pgoff = bswap_64(event->mmap.pgoff);
|
|
event->mmap.pgoff = bswap_64(event->mmap.pgoff);
|
|
|
|
+
|
|
|
|
+ if (sample_id_all) {
|
|
|
|
+ void *data = &event->mmap.filename;
|
|
|
|
+
|
|
|
|
+ data += ALIGN(strlen(data) + 1, sizeof(u64));
|
|
|
|
+ swap_sample_id_all(event, data);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
-static void perf_event__task_swap(union perf_event *event)
|
|
|
|
|
|
+static void perf_event__task_swap(union perf_event *event, bool sample_id_all)
|
|
{
|
|
{
|
|
event->fork.pid = bswap_32(event->fork.pid);
|
|
event->fork.pid = bswap_32(event->fork.pid);
|
|
event->fork.tid = bswap_32(event->fork.tid);
|
|
event->fork.tid = bswap_32(event->fork.tid);
|
|
event->fork.ppid = bswap_32(event->fork.ppid);
|
|
event->fork.ppid = bswap_32(event->fork.ppid);
|
|
event->fork.ptid = bswap_32(event->fork.ptid);
|
|
event->fork.ptid = bswap_32(event->fork.ptid);
|
|
event->fork.time = bswap_64(event->fork.time);
|
|
event->fork.time = bswap_64(event->fork.time);
|
|
|
|
+
|
|
|
|
+ if (sample_id_all)
|
|
|
|
+ swap_sample_id_all(event, &event->fork + 1);
|
|
}
|
|
}
|
|
|
|
|
|
-static void perf_event__read_swap(union perf_event *event)
|
|
|
|
|
|
+static void perf_event__read_swap(union perf_event *event, bool sample_id_all)
|
|
{
|
|
{
|
|
event->read.pid = bswap_32(event->read.pid);
|
|
event->read.pid = bswap_32(event->read.pid);
|
|
event->read.tid = bswap_32(event->read.tid);
|
|
event->read.tid = bswap_32(event->read.tid);
|
|
@@ -492,6 +520,9 @@ static void perf_event__read_swap(union perf_event *event)
|
|
event->read.time_enabled = bswap_64(event->read.time_enabled);
|
|
event->read.time_enabled = bswap_64(event->read.time_enabled);
|
|
event->read.time_running = bswap_64(event->read.time_running);
|
|
event->read.time_running = bswap_64(event->read.time_running);
|
|
event->read.id = bswap_64(event->read.id);
|
|
event->read.id = bswap_64(event->read.id);
|
|
|
|
+
|
|
|
|
+ if (sample_id_all)
|
|
|
|
+ swap_sample_id_all(event, &event->read + 1);
|
|
}
|
|
}
|
|
|
|
|
|
static u8 revbyte(u8 b)
|
|
static u8 revbyte(u8 b)
|
|
@@ -543,7 +574,8 @@ void perf_event__attr_swap(struct perf_event_attr *attr)
|
|
swap_bitfield((u8 *) (&attr->read_format + 1), sizeof(u64));
|
|
swap_bitfield((u8 *) (&attr->read_format + 1), sizeof(u64));
|
|
}
|
|
}
|
|
|
|
|
|
-static void perf_event__hdr_attr_swap(union perf_event *event)
|
|
|
|
|
|
+static void perf_event__hdr_attr_swap(union perf_event *event,
|
|
|
|
+ bool sample_id_all __used)
|
|
{
|
|
{
|
|
size_t size;
|
|
size_t size;
|
|
|
|
|
|
@@ -554,18 +586,21 @@ static void perf_event__hdr_attr_swap(union perf_event *event)
|
|
mem_bswap_64(event->attr.id, size);
|
|
mem_bswap_64(event->attr.id, size);
|
|
}
|
|
}
|
|
|
|
|
|
-static void perf_event__event_type_swap(union perf_event *event)
|
|
|
|
|
|
+static void perf_event__event_type_swap(union perf_event *event,
|
|
|
|
+ bool sample_id_all __used)
|
|
{
|
|
{
|
|
event->event_type.event_type.event_id =
|
|
event->event_type.event_type.event_id =
|
|
bswap_64(event->event_type.event_type.event_id);
|
|
bswap_64(event->event_type.event_type.event_id);
|
|
}
|
|
}
|
|
|
|
|
|
-static void perf_event__tracing_data_swap(union perf_event *event)
|
|
|
|
|
|
+static void perf_event__tracing_data_swap(union perf_event *event,
|
|
|
|
+ bool sample_id_all __used)
|
|
{
|
|
{
|
|
event->tracing_data.size = bswap_32(event->tracing_data.size);
|
|
event->tracing_data.size = bswap_32(event->tracing_data.size);
|
|
}
|
|
}
|
|
|
|
|
|
-typedef void (*perf_event__swap_op)(union perf_event *event);
|
|
|
|
|
|
+typedef void (*perf_event__swap_op)(union perf_event *event,
|
|
|
|
+ bool sample_id_all);
|
|
|
|
|
|
static perf_event__swap_op perf_event__swap_ops[] = {
|
|
static perf_event__swap_op perf_event__swap_ops[] = {
|
|
[PERF_RECORD_MMAP] = perf_event__mmap_swap,
|
|
[PERF_RECORD_MMAP] = perf_event__mmap_swap,
|
|
@@ -999,6 +1034,15 @@ static int perf_session__process_user_event(struct perf_session *session, union
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void event_swap(union perf_event *event, bool sample_id_all)
|
|
|
|
+{
|
|
|
|
+ perf_event__swap_op swap;
|
|
|
|
+
|
|
|
|
+ swap = perf_event__swap_ops[event->header.type];
|
|
|
|
+ if (swap)
|
|
|
|
+ swap(event, sample_id_all);
|
|
|
|
+}
|
|
|
|
+
|
|
static int perf_session__process_event(struct perf_session *session,
|
|
static int perf_session__process_event(struct perf_session *session,
|
|
union perf_event *event,
|
|
union perf_event *event,
|
|
struct perf_tool *tool,
|
|
struct perf_tool *tool,
|
|
@@ -1007,9 +1051,8 @@ static int perf_session__process_event(struct perf_session *session,
|
|
struct perf_sample sample;
|
|
struct perf_sample sample;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- if (session->header.needs_swap &&
|
|
|
|
- perf_event__swap_ops[event->header.type])
|
|
|
|
- perf_event__swap_ops[event->header.type](event);
|
|
|
|
|
|
+ if (session->header.needs_swap)
|
|
|
|
+ event_swap(event, session->sample_id_all);
|
|
|
|
|
|
if (event->header.type >= PERF_RECORD_HEADER_MAX)
|
|
if (event->header.type >= PERF_RECORD_HEADER_MAX)
|
|
return -EINVAL;
|
|
return -EINVAL;
|