|
@@ -494,16 +494,24 @@ int perf_evsel__open_per_thread(struct perf_evsel *evsel,
|
|
|
}
|
|
|
|
|
|
static int perf_event__parse_id_sample(const union perf_event *event, u64 type,
|
|
|
- struct perf_sample *sample)
|
|
|
+ struct perf_sample *sample,
|
|
|
+ bool swapped)
|
|
|
{
|
|
|
const u64 *array = event->sample.array;
|
|
|
+ union u64_swap u;
|
|
|
|
|
|
array += ((event->header.size -
|
|
|
sizeof(event->header)) / sizeof(u64)) - 1;
|
|
|
|
|
|
if (type & PERF_SAMPLE_CPU) {
|
|
|
- u32 *p = (u32 *)array;
|
|
|
- sample->cpu = *p;
|
|
|
+ u.val64 = *array;
|
|
|
+ if (swapped) {
|
|
|
+ /* undo swap of u64, then swap on individual u32s */
|
|
|
+ u.val64 = bswap_64(u.val64);
|
|
|
+ u.val32[0] = bswap_32(u.val32[0]);
|
|
|
+ }
|
|
|
+
|
|
|
+ sample->cpu = u.val32[0];
|
|
|
array--;
|
|
|
}
|
|
|
|
|
@@ -523,9 +531,16 @@ static int perf_event__parse_id_sample(const union perf_event *event, u64 type,
|
|
|
}
|
|
|
|
|
|
if (type & PERF_SAMPLE_TID) {
|
|
|
- u32 *p = (u32 *)array;
|
|
|
- sample->pid = p[0];
|
|
|
- sample->tid = p[1];
|
|
|
+ u.val64 = *array;
|
|
|
+ if (swapped) {
|
|
|
+ /* undo swap of u64, then swap on individual u32s */
|
|
|
+ u.val64 = bswap_64(u.val64);
|
|
|
+ u.val32[0] = bswap_32(u.val32[0]);
|
|
|
+ u.val32[1] = bswap_32(u.val32[1]);
|
|
|
+ }
|
|
|
+
|
|
|
+ sample->pid = u.val32[0];
|
|
|
+ sample->tid = u.val32[1];
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -562,7 +577,7 @@ int perf_event__parse_sample(const union perf_event *event, u64 type,
|
|
|
if (event->header.type != PERF_RECORD_SAMPLE) {
|
|
|
if (!sample_id_all)
|
|
|
return 0;
|
|
|
- return perf_event__parse_id_sample(event, type, data);
|
|
|
+ return perf_event__parse_id_sample(event, type, data, swapped);
|
|
|
}
|
|
|
|
|
|
array = event->sample.array;
|