|
@@ -1942,7 +1942,6 @@ int perf_file_header__read(struct perf_file_header *header,
|
|
|
else
|
|
|
return -1;
|
|
|
} else if (ph->needs_swap) {
|
|
|
- unsigned int i;
|
|
|
/*
|
|
|
* feature bitmap is declared as an array of unsigned longs --
|
|
|
* not good since its size can differ between the host that
|
|
@@ -1958,14 +1957,17 @@ int perf_file_header__read(struct perf_file_header *header,
|
|
|
* file), punt and fallback to the original behavior --
|
|
|
* clearing all feature bits and setting buildid.
|
|
|
*/
|
|
|
- for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i)
|
|
|
- header->adds_features[i] = bswap_64(header->adds_features[i]);
|
|
|
+ mem_bswap_64(&header->adds_features,
|
|
|
+ BITS_TO_U64(HEADER_FEAT_BITS));
|
|
|
|
|
|
if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
|
|
|
- for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i) {
|
|
|
- header->adds_features[i] = bswap_64(header->adds_features[i]);
|
|
|
- header->adds_features[i] = bswap_32(header->adds_features[i]);
|
|
|
- }
|
|
|
+ /* unswap as u64 */
|
|
|
+ mem_bswap_64(&header->adds_features,
|
|
|
+ BITS_TO_U64(HEADER_FEAT_BITS));
|
|
|
+
|
|
|
+ /* unswap as u32 */
|
|
|
+ mem_bswap_32(&header->adds_features,
|
|
|
+ BITS_TO_U32(HEADER_FEAT_BITS));
|
|
|
}
|
|
|
|
|
|
if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
|
|
@@ -2091,6 +2093,35 @@ static int read_attr(int fd, struct perf_header *ph,
|
|
|
return ret <= 0 ? -1 : 0;
|
|
|
}
|
|
|
|
|
|
+static int perf_evsel__set_tracepoint_name(struct perf_evsel *evsel)
|
|
|
+{
|
|
|
+ struct event_format *event = trace_find_event(evsel->attr.config);
|
|
|
+ char bf[128];
|
|
|
+
|
|
|
+ if (event == NULL)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ snprintf(bf, sizeof(bf), "%s:%s", event->system, event->name);
|
|
|
+ evsel->name = strdup(bf);
|
|
|
+ if (event->name == NULL)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int perf_evlist__set_tracepoint_names(struct perf_evlist *evlist)
|
|
|
+{
|
|
|
+ struct perf_evsel *pos;
|
|
|
+
|
|
|
+ list_for_each_entry(pos, &evlist->entries, node) {
|
|
|
+ if (pos->attr.type == PERF_TYPE_TRACEPOINT &&
|
|
|
+ perf_evsel__set_tracepoint_name(pos))
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
int perf_session__read_header(struct perf_session *session, int fd)
|
|
|
{
|
|
|
struct perf_header *header = &session->header;
|
|
@@ -2172,6 +2203,9 @@ int perf_session__read_header(struct perf_session *session, int fd)
|
|
|
|
|
|
lseek(fd, header->data_offset, SEEK_SET);
|
|
|
|
|
|
+ if (perf_evlist__set_tracepoint_names(session->evlist))
|
|
|
+ goto out_delete_evlist;
|
|
|
+
|
|
|
header->frozen = 1;
|
|
|
return 0;
|
|
|
out_errno:
|