Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 310594
b: refs/heads/master
c: 268fb20
h: refs/heads/master
v: v3
  • Loading branch information
Jiri Olsa authored and Arnaldo Carvalho de Melo committed May 31, 2012
1 parent 143a317 commit 57a63e1
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8db4841fc72acc58254029f050226ea5f8103854
refs/heads/master: 268fb20f832e1eb4afd5113ee31fef9332986b13
67 changes: 55 additions & 12 deletions trunk/tools/perf/util/session.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,44 +454,75 @@ 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;
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.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.tid = bswap_32(event->mmap.tid);
event->mmap.start = bswap_64(event->mmap.start);
event->mmap.len = bswap_64(event->mmap.len);
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.tid = bswap_32(event->fork.tid);
event->fork.ppid = bswap_32(event->fork.ppid);
event->fork.ptid = bswap_32(event->fork.ptid);
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.tid = bswap_32(event->read.tid);
event->read.value = bswap_64(event->read.value);
event->read.time_enabled = bswap_64(event->read.time_enabled);
event->read.time_running = bswap_64(event->read.time_running);
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)
Expand Down Expand Up @@ -543,7 +574,8 @@ void perf_event__attr_swap(struct perf_event_attr *attr)
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;

Expand All @@ -554,18 +586,21 @@ static void perf_event__hdr_attr_swap(union perf_event *event)
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 =
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);
}

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[] = {
[PERF_RECORD_MMAP] = perf_event__mmap_swap,
Expand Down Expand Up @@ -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,
union perf_event *event,
struct perf_tool *tool,
Expand All @@ -1007,9 +1051,8 @@ static int perf_session__process_event(struct perf_session *session,
struct perf_sample sample;
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)
return -EINVAL;
Expand Down

0 comments on commit 57a63e1

Please sign in to comment.