Merge branch 'dmi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvar...
[linux-2.6-microblaze.git] / tools / perf / util / data-convert-bt.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * CTF writing support via babeltrace.
4  *
5  * Copyright (C) 2014, Jiri Olsa <jolsa@redhat.com>
6  * Copyright (C) 2014, Sebastian Andrzej Siewior <bigeasy@linutronix.de>
7  */
8
9 #include <errno.h>
10 #include <inttypes.h>
11 #include <linux/compiler.h>
12 #include <linux/kernel.h>
13 #include <linux/zalloc.h>
14 #include <babeltrace/ctf-writer/writer.h>
15 #include <babeltrace/ctf-writer/clock.h>
16 #include <babeltrace/ctf-writer/stream.h>
17 #include <babeltrace/ctf-writer/event.h>
18 #include <babeltrace/ctf-writer/event-types.h>
19 #include <babeltrace/ctf-writer/event-fields.h>
20 #include <babeltrace/ctf-ir/utils.h>
21 #include <babeltrace/ctf/events.h>
22 #include <traceevent/event-parse.h>
23 #include "asm/bug.h"
24 #include "data-convert.h"
25 #include "session.h"
26 #include "debug.h"
27 #include "tool.h"
28 #include "evlist.h"
29 #include "evsel.h"
30 #include "machine.h"
31 #include "config.h"
32 #include <linux/ctype.h>
33 #include <linux/err.h>
34 #include <linux/time64.h>
35 #include "util.h"
36 #include "clockid.h"
37
38 #define pr_N(n, fmt, ...) \
39         eprintf(n, debug_data_convert, fmt, ##__VA_ARGS__)
40
41 #define pr(fmt, ...)  pr_N(1, pr_fmt(fmt), ##__VA_ARGS__)
42 #define pr2(fmt, ...) pr_N(2, pr_fmt(fmt), ##__VA_ARGS__)
43
44 #define pr_time2(t, fmt, ...) pr_time_N(2, debug_data_convert, t, pr_fmt(fmt), ##__VA_ARGS__)
45
46 struct evsel_priv {
47         struct bt_ctf_event_class *event_class;
48 };
49
50 #define MAX_CPUS        4096
51
52 struct ctf_stream {
53         struct bt_ctf_stream *stream;
54         int cpu;
55         u32 count;
56 };
57
58 struct ctf_writer {
59         /* writer primitives */
60         struct bt_ctf_writer             *writer;
61         struct ctf_stream               **stream;
62         int                               stream_cnt;
63         struct bt_ctf_stream_class       *stream_class;
64         struct bt_ctf_clock              *clock;
65
66         /* data types */
67         union {
68                 struct {
69                         struct bt_ctf_field_type        *s64;
70                         struct bt_ctf_field_type        *u64;
71                         struct bt_ctf_field_type        *s32;
72                         struct bt_ctf_field_type        *u32;
73                         struct bt_ctf_field_type        *string;
74                         struct bt_ctf_field_type        *u32_hex;
75                         struct bt_ctf_field_type        *u64_hex;
76                 };
77                 struct bt_ctf_field_type *array[6];
78         } data;
79         struct bt_ctf_event_class       *comm_class;
80         struct bt_ctf_event_class       *exit_class;
81         struct bt_ctf_event_class       *fork_class;
82         struct bt_ctf_event_class       *mmap_class;
83         struct bt_ctf_event_class       *mmap2_class;
84 };
85
86 struct convert {
87         struct perf_tool        tool;
88         struct ctf_writer       writer;
89
90         u64                     events_size;
91         u64                     events_count;
92         u64                     non_sample_count;
93
94         /* Ordered events configured queue size. */
95         u64                     queue_size;
96 };
97
98 static int value_set(struct bt_ctf_field_type *type,
99                      struct bt_ctf_event *event,
100                      const char *name, u64 val)
101 {
102         struct bt_ctf_field *field;
103         bool sign = bt_ctf_field_type_integer_get_signed(type);
104         int ret;
105
106         field = bt_ctf_field_create(type);
107         if (!field) {
108                 pr_err("failed to create a field %s\n", name);
109                 return -1;
110         }
111
112         if (sign) {
113                 ret = bt_ctf_field_signed_integer_set_value(field, val);
114                 if (ret) {
115                         pr_err("failed to set field value %s\n", name);
116                         goto err;
117                 }
118         } else {
119                 ret = bt_ctf_field_unsigned_integer_set_value(field, val);
120                 if (ret) {
121                         pr_err("failed to set field value %s\n", name);
122                         goto err;
123                 }
124         }
125
126         ret = bt_ctf_event_set_payload(event, name, field);
127         if (ret) {
128                 pr_err("failed to set payload %s\n", name);
129                 goto err;
130         }
131
132         pr2("  SET [%s = %" PRIu64 "]\n", name, val);
133
134 err:
135         bt_ctf_field_put(field);
136         return ret;
137 }
138
139 #define __FUNC_VALUE_SET(_name, _val_type)                              \
140 static __maybe_unused int value_set_##_name(struct ctf_writer *cw,      \
141                              struct bt_ctf_event *event,                \
142                              const char *name,                          \
143                              _val_type val)                             \
144 {                                                                       \
145         struct bt_ctf_field_type *type = cw->data._name;                \
146         return value_set(type, event, name, (u64) val);                 \
147 }
148
149 #define FUNC_VALUE_SET(_name) __FUNC_VALUE_SET(_name, _name)
150
151 FUNC_VALUE_SET(s32)
152 FUNC_VALUE_SET(u32)
153 FUNC_VALUE_SET(s64)
154 FUNC_VALUE_SET(u64)
155 __FUNC_VALUE_SET(u64_hex, u64)
156
157 static int string_set_value(struct bt_ctf_field *field, const char *string);
158 static __maybe_unused int
159 value_set_string(struct ctf_writer *cw, struct bt_ctf_event *event,
160                  const char *name, const char *string)
161 {
162         struct bt_ctf_field_type *type = cw->data.string;
163         struct bt_ctf_field *field;
164         int ret = 0;
165
166         field = bt_ctf_field_create(type);
167         if (!field) {
168                 pr_err("failed to create a field %s\n", name);
169                 return -1;
170         }
171
172         ret = string_set_value(field, string);
173         if (ret) {
174                 pr_err("failed to set value %s\n", name);
175                 goto err_put_field;
176         }
177
178         ret = bt_ctf_event_set_payload(event, name, field);
179         if (ret)
180                 pr_err("failed to set payload %s\n", name);
181
182 err_put_field:
183         bt_ctf_field_put(field);
184         return ret;
185 }
186
187 static struct bt_ctf_field_type*
188 get_tracepoint_field_type(struct ctf_writer *cw, struct tep_format_field *field)
189 {
190         unsigned long flags = field->flags;
191
192         if (flags & TEP_FIELD_IS_STRING)
193                 return cw->data.string;
194
195         if (!(flags & TEP_FIELD_IS_SIGNED)) {
196                 /* unsigned long are mostly pointers */
197                 if (flags & TEP_FIELD_IS_LONG || flags & TEP_FIELD_IS_POINTER)
198                         return cw->data.u64_hex;
199         }
200
201         if (flags & TEP_FIELD_IS_SIGNED) {
202                 if (field->size == 8)
203                         return cw->data.s64;
204                 else
205                         return cw->data.s32;
206         }
207
208         if (field->size == 8)
209                 return cw->data.u64;
210         else
211                 return cw->data.u32;
212 }
213
214 static unsigned long long adjust_signedness(unsigned long long value_int, int size)
215 {
216         unsigned long long value_mask;
217
218         /*
219          * value_mask = (1 << (size * 8 - 1)) - 1.
220          * Directly set value_mask for code readers.
221          */
222         switch (size) {
223         case 1:
224                 value_mask = 0x7fULL;
225                 break;
226         case 2:
227                 value_mask = 0x7fffULL;
228                 break;
229         case 4:
230                 value_mask = 0x7fffffffULL;
231                 break;
232         case 8:
233                 /*
234                  * For 64 bit value, return it self. There is no need
235                  * to fill high bit.
236                  */
237                 /* Fall through */
238         default:
239                 /* BUG! */
240                 return value_int;
241         }
242
243         /* If it is a positive value, don't adjust. */
244         if ((value_int & (~0ULL - value_mask)) == 0)
245                 return value_int;
246
247         /* Fill upper part of value_int with 1 to make it a negative long long. */
248         return (value_int & value_mask) | ~value_mask;
249 }
250
251 static int string_set_value(struct bt_ctf_field *field, const char *string)
252 {
253         char *buffer = NULL;
254         size_t len = strlen(string), i, p;
255         int err;
256
257         for (i = p = 0; i < len; i++, p++) {
258                 if (isprint(string[i])) {
259                         if (!buffer)
260                                 continue;
261                         buffer[p] = string[i];
262                 } else {
263                         char numstr[5];
264
265                         snprintf(numstr, sizeof(numstr), "\\x%02x",
266                                  (unsigned int)(string[i]) & 0xff);
267
268                         if (!buffer) {
269                                 buffer = zalloc(i + (len - i) * 4 + 2);
270                                 if (!buffer) {
271                                         pr_err("failed to set unprintable string '%s'\n", string);
272                                         return bt_ctf_field_string_set_value(field, "UNPRINTABLE-STRING");
273                                 }
274                                 if (i > 0)
275                                         strncpy(buffer, string, i);
276                         }
277                         memcpy(buffer + p, numstr, 4);
278                         p += 3;
279                 }
280         }
281
282         if (!buffer)
283                 return bt_ctf_field_string_set_value(field, string);
284         err = bt_ctf_field_string_set_value(field, buffer);
285         free(buffer);
286         return err;
287 }
288
289 static int add_tracepoint_field_value(struct ctf_writer *cw,
290                                       struct bt_ctf_event_class *event_class,
291                                       struct bt_ctf_event *event,
292                                       struct perf_sample *sample,
293                                       struct tep_format_field *fmtf)
294 {
295         struct bt_ctf_field_type *type;
296         struct bt_ctf_field *array_field;
297         struct bt_ctf_field *field;
298         const char *name = fmtf->name;
299         void *data = sample->raw_data;
300         unsigned long flags = fmtf->flags;
301         unsigned int n_items;
302         unsigned int i;
303         unsigned int offset;
304         unsigned int len;
305         int ret;
306
307         name = fmtf->alias;
308         offset = fmtf->offset;
309         len = fmtf->size;
310         if (flags & TEP_FIELD_IS_STRING)
311                 flags &= ~TEP_FIELD_IS_ARRAY;
312
313         if (flags & TEP_FIELD_IS_DYNAMIC) {
314                 unsigned long long tmp_val;
315
316                 tmp_val = tep_read_number(fmtf->event->tep,
317                                           data + offset, len);
318                 offset = tmp_val;
319                 len = offset >> 16;
320                 offset &= 0xffff;
321                 if (flags & TEP_FIELD_IS_RELATIVE)
322                         offset += fmtf->offset + fmtf->size;
323         }
324
325         if (flags & TEP_FIELD_IS_ARRAY) {
326
327                 type = bt_ctf_event_class_get_field_by_name(
328                                 event_class, name);
329                 array_field = bt_ctf_field_create(type);
330                 bt_ctf_field_type_put(type);
331                 if (!array_field) {
332                         pr_err("Failed to create array type %s\n", name);
333                         return -1;
334                 }
335
336                 len = fmtf->size / fmtf->arraylen;
337                 n_items = fmtf->arraylen;
338         } else {
339                 n_items = 1;
340                 array_field = NULL;
341         }
342
343         type = get_tracepoint_field_type(cw, fmtf);
344
345         for (i = 0; i < n_items; i++) {
346                 if (flags & TEP_FIELD_IS_ARRAY)
347                         field = bt_ctf_field_array_get_field(array_field, i);
348                 else
349                         field = bt_ctf_field_create(type);
350
351                 if (!field) {
352                         pr_err("failed to create a field %s\n", name);
353                         return -1;
354                 }
355
356                 if (flags & TEP_FIELD_IS_STRING)
357                         ret = string_set_value(field, data + offset + i * len);
358                 else {
359                         unsigned long long value_int;
360
361                         value_int = tep_read_number(
362                                         fmtf->event->tep,
363                                         data + offset + i * len, len);
364
365                         if (!(flags & TEP_FIELD_IS_SIGNED))
366                                 ret = bt_ctf_field_unsigned_integer_set_value(
367                                                 field, value_int);
368                         else
369                                 ret = bt_ctf_field_signed_integer_set_value(
370                                                 field, adjust_signedness(value_int, len));
371                 }
372
373                 if (ret) {
374                         pr_err("failed to set file value %s\n", name);
375                         goto err_put_field;
376                 }
377                 if (!(flags & TEP_FIELD_IS_ARRAY)) {
378                         ret = bt_ctf_event_set_payload(event, name, field);
379                         if (ret) {
380                                 pr_err("failed to set payload %s\n", name);
381                                 goto err_put_field;
382                         }
383                 }
384                 bt_ctf_field_put(field);
385         }
386         if (flags & TEP_FIELD_IS_ARRAY) {
387                 ret = bt_ctf_event_set_payload(event, name, array_field);
388                 if (ret) {
389                         pr_err("Failed add payload array %s\n", name);
390                         return -1;
391                 }
392                 bt_ctf_field_put(array_field);
393         }
394         return 0;
395
396 err_put_field:
397         bt_ctf_field_put(field);
398         return -1;
399 }
400
401 static int add_tracepoint_fields_values(struct ctf_writer *cw,
402                                         struct bt_ctf_event_class *event_class,
403                                         struct bt_ctf_event *event,
404                                         struct tep_format_field *fields,
405                                         struct perf_sample *sample)
406 {
407         struct tep_format_field *field;
408         int ret;
409
410         for (field = fields; field; field = field->next) {
411                 ret = add_tracepoint_field_value(cw, event_class, event, sample,
412                                 field);
413                 if (ret)
414                         return -1;
415         }
416         return 0;
417 }
418
419 static int add_tracepoint_values(struct ctf_writer *cw,
420                                  struct bt_ctf_event_class *event_class,
421                                  struct bt_ctf_event *event,
422                                  struct evsel *evsel,
423                                  struct perf_sample *sample)
424 {
425         struct tep_format_field *common_fields = evsel->tp_format->format.common_fields;
426         struct tep_format_field *fields        = evsel->tp_format->format.fields;
427         int ret;
428
429         ret = add_tracepoint_fields_values(cw, event_class, event,
430                                            common_fields, sample);
431         if (!ret)
432                 ret = add_tracepoint_fields_values(cw, event_class, event,
433                                                    fields, sample);
434
435         return ret;
436 }
437
438 static int
439 add_bpf_output_values(struct bt_ctf_event_class *event_class,
440                       struct bt_ctf_event *event,
441                       struct perf_sample *sample)
442 {
443         struct bt_ctf_field_type *len_type, *seq_type;
444         struct bt_ctf_field *len_field, *seq_field;
445         unsigned int raw_size = sample->raw_size;
446         unsigned int nr_elements = raw_size / sizeof(u32);
447         unsigned int i;
448         int ret;
449
450         if (nr_elements * sizeof(u32) != raw_size)
451                 pr_warning("Incorrect raw_size (%u) in bpf output event, skip %zu bytes\n",
452                            raw_size, nr_elements * sizeof(u32) - raw_size);
453
454         len_type = bt_ctf_event_class_get_field_by_name(event_class, "raw_len");
455         len_field = bt_ctf_field_create(len_type);
456         if (!len_field) {
457                 pr_err("failed to create 'raw_len' for bpf output event\n");
458                 ret = -1;
459                 goto put_len_type;
460         }
461
462         ret = bt_ctf_field_unsigned_integer_set_value(len_field, nr_elements);
463         if (ret) {
464                 pr_err("failed to set field value for raw_len\n");
465                 goto put_len_field;
466         }
467         ret = bt_ctf_event_set_payload(event, "raw_len", len_field);
468         if (ret) {
469                 pr_err("failed to set payload to raw_len\n");
470                 goto put_len_field;
471         }
472
473         seq_type = bt_ctf_event_class_get_field_by_name(event_class, "raw_data");
474         seq_field = bt_ctf_field_create(seq_type);
475         if (!seq_field) {
476                 pr_err("failed to create 'raw_data' for bpf output event\n");
477                 ret = -1;
478                 goto put_seq_type;
479         }
480
481         ret = bt_ctf_field_sequence_set_length(seq_field, len_field);
482         if (ret) {
483                 pr_err("failed to set length of 'raw_data'\n");
484                 goto put_seq_field;
485         }
486
487         for (i = 0; i < nr_elements; i++) {
488                 struct bt_ctf_field *elem_field =
489                         bt_ctf_field_sequence_get_field(seq_field, i);
490
491                 ret = bt_ctf_field_unsigned_integer_set_value(elem_field,
492                                 ((u32 *)(sample->raw_data))[i]);
493
494                 bt_ctf_field_put(elem_field);
495                 if (ret) {
496                         pr_err("failed to set raw_data[%d]\n", i);
497                         goto put_seq_field;
498                 }
499         }
500
501         ret = bt_ctf_event_set_payload(event, "raw_data", seq_field);
502         if (ret)
503                 pr_err("failed to set payload for raw_data\n");
504
505 put_seq_field:
506         bt_ctf_field_put(seq_field);
507 put_seq_type:
508         bt_ctf_field_type_put(seq_type);
509 put_len_field:
510         bt_ctf_field_put(len_field);
511 put_len_type:
512         bt_ctf_field_type_put(len_type);
513         return ret;
514 }
515
516 static int
517 add_callchain_output_values(struct bt_ctf_event_class *event_class,
518                       struct bt_ctf_event *event,
519                       struct ip_callchain *callchain)
520 {
521         struct bt_ctf_field_type *len_type, *seq_type;
522         struct bt_ctf_field *len_field, *seq_field;
523         unsigned int nr_elements = callchain->nr;
524         unsigned int i;
525         int ret;
526
527         len_type = bt_ctf_event_class_get_field_by_name(
528                         event_class, "perf_callchain_size");
529         len_field = bt_ctf_field_create(len_type);
530         if (!len_field) {
531                 pr_err("failed to create 'perf_callchain_size' for callchain output event\n");
532                 ret = -1;
533                 goto put_len_type;
534         }
535
536         ret = bt_ctf_field_unsigned_integer_set_value(len_field, nr_elements);
537         if (ret) {
538                 pr_err("failed to set field value for perf_callchain_size\n");
539                 goto put_len_field;
540         }
541         ret = bt_ctf_event_set_payload(event, "perf_callchain_size", len_field);
542         if (ret) {
543                 pr_err("failed to set payload to perf_callchain_size\n");
544                 goto put_len_field;
545         }
546
547         seq_type = bt_ctf_event_class_get_field_by_name(
548                         event_class, "perf_callchain");
549         seq_field = bt_ctf_field_create(seq_type);
550         if (!seq_field) {
551                 pr_err("failed to create 'perf_callchain' for callchain output event\n");
552                 ret = -1;
553                 goto put_seq_type;
554         }
555
556         ret = bt_ctf_field_sequence_set_length(seq_field, len_field);
557         if (ret) {
558                 pr_err("failed to set length of 'perf_callchain'\n");
559                 goto put_seq_field;
560         }
561
562         for (i = 0; i < nr_elements; i++) {
563                 struct bt_ctf_field *elem_field =
564                         bt_ctf_field_sequence_get_field(seq_field, i);
565
566                 ret = bt_ctf_field_unsigned_integer_set_value(elem_field,
567                                 ((u64 *)(callchain->ips))[i]);
568
569                 bt_ctf_field_put(elem_field);
570                 if (ret) {
571                         pr_err("failed to set callchain[%d]\n", i);
572                         goto put_seq_field;
573                 }
574         }
575
576         ret = bt_ctf_event_set_payload(event, "perf_callchain", seq_field);
577         if (ret)
578                 pr_err("failed to set payload for raw_data\n");
579
580 put_seq_field:
581         bt_ctf_field_put(seq_field);
582 put_seq_type:
583         bt_ctf_field_type_put(seq_type);
584 put_len_field:
585         bt_ctf_field_put(len_field);
586 put_len_type:
587         bt_ctf_field_type_put(len_type);
588         return ret;
589 }
590
591 static int add_generic_values(struct ctf_writer *cw,
592                               struct bt_ctf_event *event,
593                               struct evsel *evsel,
594                               struct perf_sample *sample)
595 {
596         u64 type = evsel->core.attr.sample_type;
597         int ret;
598
599         /*
600          * missing:
601          *   PERF_SAMPLE_TIME         - not needed as we have it in
602          *                              ctf event header
603          *   PERF_SAMPLE_READ         - TODO
604          *   PERF_SAMPLE_RAW          - tracepoint fields are handled separately
605          *   PERF_SAMPLE_BRANCH_STACK - TODO
606          *   PERF_SAMPLE_REGS_USER    - TODO
607          *   PERF_SAMPLE_STACK_USER   - TODO
608          */
609
610         if (type & PERF_SAMPLE_IP) {
611                 ret = value_set_u64_hex(cw, event, "perf_ip", sample->ip);
612                 if (ret)
613                         return -1;
614         }
615
616         if (type & PERF_SAMPLE_TID) {
617                 ret = value_set_s32(cw, event, "perf_tid", sample->tid);
618                 if (ret)
619                         return -1;
620
621                 ret = value_set_s32(cw, event, "perf_pid", sample->pid);
622                 if (ret)
623                         return -1;
624         }
625
626         if ((type & PERF_SAMPLE_ID) ||
627             (type & PERF_SAMPLE_IDENTIFIER)) {
628                 ret = value_set_u64(cw, event, "perf_id", sample->id);
629                 if (ret)
630                         return -1;
631         }
632
633         if (type & PERF_SAMPLE_STREAM_ID) {
634                 ret = value_set_u64(cw, event, "perf_stream_id", sample->stream_id);
635                 if (ret)
636                         return -1;
637         }
638
639         if (type & PERF_SAMPLE_PERIOD) {
640                 ret = value_set_u64(cw, event, "perf_period", sample->period);
641                 if (ret)
642                         return -1;
643         }
644
645         if (type & PERF_SAMPLE_WEIGHT) {
646                 ret = value_set_u64(cw, event, "perf_weight", sample->weight);
647                 if (ret)
648                         return -1;
649         }
650
651         if (type & PERF_SAMPLE_DATA_SRC) {
652                 ret = value_set_u64(cw, event, "perf_data_src",
653                                 sample->data_src);
654                 if (ret)
655                         return -1;
656         }
657
658         if (type & PERF_SAMPLE_TRANSACTION) {
659                 ret = value_set_u64(cw, event, "perf_transaction",
660                                 sample->transaction);
661                 if (ret)
662                         return -1;
663         }
664
665         return 0;
666 }
667
668 static int ctf_stream__flush(struct ctf_stream *cs)
669 {
670         int err = 0;
671
672         if (cs) {
673                 err = bt_ctf_stream_flush(cs->stream);
674                 if (err)
675                         pr_err("CTF stream %d flush failed\n", cs->cpu);
676
677                 pr("Flush stream for cpu %d (%u samples)\n",
678                    cs->cpu, cs->count);
679
680                 cs->count = 0;
681         }
682
683         return err;
684 }
685
686 static struct ctf_stream *ctf_stream__create(struct ctf_writer *cw, int cpu)
687 {
688         struct ctf_stream *cs;
689         struct bt_ctf_field *pkt_ctx   = NULL;
690         struct bt_ctf_field *cpu_field = NULL;
691         struct bt_ctf_stream *stream   = NULL;
692         int ret;
693
694         cs = zalloc(sizeof(*cs));
695         if (!cs) {
696                 pr_err("Failed to allocate ctf stream\n");
697                 return NULL;
698         }
699
700         stream = bt_ctf_writer_create_stream(cw->writer, cw->stream_class);
701         if (!stream) {
702                 pr_err("Failed to create CTF stream\n");
703                 goto out;
704         }
705
706         pkt_ctx = bt_ctf_stream_get_packet_context(stream);
707         if (!pkt_ctx) {
708                 pr_err("Failed to obtain packet context\n");
709                 goto out;
710         }
711
712         cpu_field = bt_ctf_field_structure_get_field(pkt_ctx, "cpu_id");
713         bt_ctf_field_put(pkt_ctx);
714         if (!cpu_field) {
715                 pr_err("Failed to obtain cpu field\n");
716                 goto out;
717         }
718
719         ret = bt_ctf_field_unsigned_integer_set_value(cpu_field, (u32) cpu);
720         if (ret) {
721                 pr_err("Failed to update CPU number\n");
722                 goto out;
723         }
724
725         bt_ctf_field_put(cpu_field);
726
727         cs->cpu    = cpu;
728         cs->stream = stream;
729         return cs;
730
731 out:
732         if (cpu_field)
733                 bt_ctf_field_put(cpu_field);
734         if (stream)
735                 bt_ctf_stream_put(stream);
736
737         free(cs);
738         return NULL;
739 }
740
741 static void ctf_stream__delete(struct ctf_stream *cs)
742 {
743         if (cs) {
744                 bt_ctf_stream_put(cs->stream);
745                 free(cs);
746         }
747 }
748
749 static struct ctf_stream *ctf_stream(struct ctf_writer *cw, int cpu)
750 {
751         struct ctf_stream *cs = cw->stream[cpu];
752
753         if (!cs) {
754                 cs = ctf_stream__create(cw, cpu);
755                 cw->stream[cpu] = cs;
756         }
757
758         return cs;
759 }
760
761 static int get_sample_cpu(struct ctf_writer *cw, struct perf_sample *sample,
762                           struct evsel *evsel)
763 {
764         int cpu = 0;
765
766         if (evsel->core.attr.sample_type & PERF_SAMPLE_CPU)
767                 cpu = sample->cpu;
768
769         if (cpu > cw->stream_cnt) {
770                 pr_err("Event was recorded for CPU %d, limit is at %d.\n",
771                         cpu, cw->stream_cnt);
772                 cpu = 0;
773         }
774
775         return cpu;
776 }
777
778 #define STREAM_FLUSH_COUNT 100000
779
780 /*
781  * Currently we have no other way to determine the
782  * time for the stream flush other than keep track
783  * of the number of events and check it against
784  * threshold.
785  */
786 static bool is_flush_needed(struct ctf_stream *cs)
787 {
788         return cs->count >= STREAM_FLUSH_COUNT;
789 }
790
791 static int process_sample_event(struct perf_tool *tool,
792                                 union perf_event *_event,
793                                 struct perf_sample *sample,
794                                 struct evsel *evsel,
795                                 struct machine *machine __maybe_unused)
796 {
797         struct convert *c = container_of(tool, struct convert, tool);
798         struct evsel_priv *priv = evsel->priv;
799         struct ctf_writer *cw = &c->writer;
800         struct ctf_stream *cs;
801         struct bt_ctf_event_class *event_class;
802         struct bt_ctf_event *event;
803         int ret;
804         unsigned long type = evsel->core.attr.sample_type;
805
806         if (WARN_ONCE(!priv, "Failed to setup all events.\n"))
807                 return 0;
808
809         event_class = priv->event_class;
810
811         /* update stats */
812         c->events_count++;
813         c->events_size += _event->header.size;
814
815         pr_time2(sample->time, "sample %" PRIu64 "\n", c->events_count);
816
817         event = bt_ctf_event_create(event_class);
818         if (!event) {
819                 pr_err("Failed to create an CTF event\n");
820                 return -1;
821         }
822
823         bt_ctf_clock_set_time(cw->clock, sample->time);
824
825         ret = add_generic_values(cw, event, evsel, sample);
826         if (ret)
827                 return -1;
828
829         if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) {
830                 ret = add_tracepoint_values(cw, event_class, event,
831                                             evsel, sample);
832                 if (ret)
833                         return -1;
834         }
835
836         if (type & PERF_SAMPLE_CALLCHAIN) {
837                 ret = add_callchain_output_values(event_class,
838                                 event, sample->callchain);
839                 if (ret)
840                         return -1;
841         }
842
843         if (evsel__is_bpf_output(evsel)) {
844                 ret = add_bpf_output_values(event_class, event, sample);
845                 if (ret)
846                         return -1;
847         }
848
849         cs = ctf_stream(cw, get_sample_cpu(cw, sample, evsel));
850         if (cs) {
851                 if (is_flush_needed(cs))
852                         ctf_stream__flush(cs);
853
854                 cs->count++;
855                 bt_ctf_stream_append_event(cs->stream, event);
856         }
857
858         bt_ctf_event_put(event);
859         return cs ? 0 : -1;
860 }
861
862 #define __NON_SAMPLE_SET_FIELD(_name, _type, _field)    \
863 do {                                                    \
864         ret = value_set_##_type(cw, event, #_field, _event->_name._field);\
865         if (ret)                                        \
866                 return -1;                              \
867 } while(0)
868
869 #define __FUNC_PROCESS_NON_SAMPLE(_name, body)  \
870 static int process_##_name##_event(struct perf_tool *tool,      \
871                                    union perf_event *_event,    \
872                                    struct perf_sample *sample,  \
873                                    struct machine *machine)     \
874 {                                                               \
875         struct convert *c = container_of(tool, struct convert, tool);\
876         struct ctf_writer *cw = &c->writer;                     \
877         struct bt_ctf_event_class *event_class = cw->_name##_class;\
878         struct bt_ctf_event *event;                             \
879         struct ctf_stream *cs;                                  \
880         int ret;                                                \
881                                                                 \
882         c->non_sample_count++;                                  \
883         c->events_size += _event->header.size;                  \
884         event = bt_ctf_event_create(event_class);               \
885         if (!event) {                                           \
886                 pr_err("Failed to create an CTF event\n");      \
887                 return -1;                                      \
888         }                                                       \
889                                                                 \
890         bt_ctf_clock_set_time(cw->clock, sample->time);         \
891         body                                                    \
892         cs = ctf_stream(cw, 0);                                 \
893         if (cs) {                                               \
894                 if (is_flush_needed(cs))                        \
895                         ctf_stream__flush(cs);                  \
896                                                                 \
897                 cs->count++;                                    \
898                 bt_ctf_stream_append_event(cs->stream, event);  \
899         }                                                       \
900         bt_ctf_event_put(event);                                \
901                                                                 \
902         return perf_event__process_##_name(tool, _event, sample, machine);\
903 }
904
905 __FUNC_PROCESS_NON_SAMPLE(comm,
906         __NON_SAMPLE_SET_FIELD(comm, u32, pid);
907         __NON_SAMPLE_SET_FIELD(comm, u32, tid);
908         __NON_SAMPLE_SET_FIELD(comm, string, comm);
909 )
910 __FUNC_PROCESS_NON_SAMPLE(fork,
911         __NON_SAMPLE_SET_FIELD(fork, u32, pid);
912         __NON_SAMPLE_SET_FIELD(fork, u32, ppid);
913         __NON_SAMPLE_SET_FIELD(fork, u32, tid);
914         __NON_SAMPLE_SET_FIELD(fork, u32, ptid);
915         __NON_SAMPLE_SET_FIELD(fork, u64, time);
916 )
917
918 __FUNC_PROCESS_NON_SAMPLE(exit,
919         __NON_SAMPLE_SET_FIELD(fork, u32, pid);
920         __NON_SAMPLE_SET_FIELD(fork, u32, ppid);
921         __NON_SAMPLE_SET_FIELD(fork, u32, tid);
922         __NON_SAMPLE_SET_FIELD(fork, u32, ptid);
923         __NON_SAMPLE_SET_FIELD(fork, u64, time);
924 )
925 __FUNC_PROCESS_NON_SAMPLE(mmap,
926         __NON_SAMPLE_SET_FIELD(mmap, u32, pid);
927         __NON_SAMPLE_SET_FIELD(mmap, u32, tid);
928         __NON_SAMPLE_SET_FIELD(mmap, u64_hex, start);
929         __NON_SAMPLE_SET_FIELD(mmap, string, filename);
930 )
931 __FUNC_PROCESS_NON_SAMPLE(mmap2,
932         __NON_SAMPLE_SET_FIELD(mmap2, u32, pid);
933         __NON_SAMPLE_SET_FIELD(mmap2, u32, tid);
934         __NON_SAMPLE_SET_FIELD(mmap2, u64_hex, start);
935         __NON_SAMPLE_SET_FIELD(mmap2, string, filename);
936 )
937 #undef __NON_SAMPLE_SET_FIELD
938 #undef __FUNC_PROCESS_NON_SAMPLE
939
940 /* If dup < 0, add a prefix. Else, add _dupl_X suffix. */
941 static char *change_name(char *name, char *orig_name, int dup)
942 {
943         char *new_name = NULL;
944         size_t len;
945
946         if (!name)
947                 name = orig_name;
948
949         if (dup >= 10)
950                 goto out;
951         /*
952          * Add '_' prefix to potential keywork.  According to
953          * Mathieu Desnoyers (https://lore.kernel.org/lkml/1074266107.40857.1422045946295.JavaMail.zimbra@efficios.com),
954          * further CTF spec updating may require us to use '$'.
955          */
956         if (dup < 0)
957                 len = strlen(name) + sizeof("_");
958         else
959                 len = strlen(orig_name) + sizeof("_dupl_X");
960
961         new_name = malloc(len);
962         if (!new_name)
963                 goto out;
964
965         if (dup < 0)
966                 snprintf(new_name, len, "_%s", name);
967         else
968                 snprintf(new_name, len, "%s_dupl_%d", orig_name, dup);
969
970 out:
971         if (name != orig_name)
972                 free(name);
973         return new_name;
974 }
975
976 static int event_class_add_field(struct bt_ctf_event_class *event_class,
977                 struct bt_ctf_field_type *type,
978                 struct tep_format_field *field)
979 {
980         struct bt_ctf_field_type *t = NULL;
981         char *name;
982         int dup = 1;
983         int ret;
984
985         /* alias was already assigned */
986         if (field->alias != field->name)
987                 return bt_ctf_event_class_add_field(event_class, type,
988                                 (char *)field->alias);
989
990         name = field->name;
991
992         /* If 'name' is a keywork, add prefix. */
993         if (bt_ctf_validate_identifier(name))
994                 name = change_name(name, field->name, -1);
995
996         if (!name) {
997                 pr_err("Failed to fix invalid identifier.");
998                 return -1;
999         }
1000         while ((t = bt_ctf_event_class_get_field_by_name(event_class, name))) {
1001                 bt_ctf_field_type_put(t);
1002                 name = change_name(name, field->name, dup++);
1003                 if (!name) {
1004                         pr_err("Failed to create dup name for '%s'\n", field->name);
1005                         return -1;
1006                 }
1007         }
1008
1009         ret = bt_ctf_event_class_add_field(event_class, type, name);
1010         if (!ret)
1011                 field->alias = name;
1012
1013         return ret;
1014 }
1015
1016 static int add_tracepoint_fields_types(struct ctf_writer *cw,
1017                                        struct tep_format_field *fields,
1018                                        struct bt_ctf_event_class *event_class)
1019 {
1020         struct tep_format_field *field;
1021         int ret;
1022
1023         for (field = fields; field; field = field->next) {
1024                 struct bt_ctf_field_type *type;
1025                 unsigned long flags = field->flags;
1026
1027                 pr2("  field '%s'\n", field->name);
1028
1029                 type = get_tracepoint_field_type(cw, field);
1030                 if (!type)
1031                         return -1;
1032
1033                 /*
1034                  * A string is an array of chars. For this we use the string
1035                  * type and don't care that it is an array. What we don't
1036                  * support is an array of strings.
1037                  */
1038                 if (flags & TEP_FIELD_IS_STRING)
1039                         flags &= ~TEP_FIELD_IS_ARRAY;
1040
1041                 if (flags & TEP_FIELD_IS_ARRAY)
1042                         type = bt_ctf_field_type_array_create(type, field->arraylen);
1043
1044                 ret = event_class_add_field(event_class, type, field);
1045
1046                 if (flags & TEP_FIELD_IS_ARRAY)
1047                         bt_ctf_field_type_put(type);
1048
1049                 if (ret) {
1050                         pr_err("Failed to add field '%s': %d\n",
1051                                         field->name, ret);
1052                         return -1;
1053                 }
1054         }
1055
1056         return 0;
1057 }
1058
1059 static int add_tracepoint_types(struct ctf_writer *cw,
1060                                 struct evsel *evsel,
1061                                 struct bt_ctf_event_class *class)
1062 {
1063         struct tep_format_field *common_fields = evsel->tp_format->format.common_fields;
1064         struct tep_format_field *fields        = evsel->tp_format->format.fields;
1065         int ret;
1066
1067         ret = add_tracepoint_fields_types(cw, common_fields, class);
1068         if (!ret)
1069                 ret = add_tracepoint_fields_types(cw, fields, class);
1070
1071         return ret;
1072 }
1073
1074 static int add_bpf_output_types(struct ctf_writer *cw,
1075                                 struct bt_ctf_event_class *class)
1076 {
1077         struct bt_ctf_field_type *len_type = cw->data.u32;
1078         struct bt_ctf_field_type *seq_base_type = cw->data.u32_hex;
1079         struct bt_ctf_field_type *seq_type;
1080         int ret;
1081
1082         ret = bt_ctf_event_class_add_field(class, len_type, "raw_len");
1083         if (ret)
1084                 return ret;
1085
1086         seq_type = bt_ctf_field_type_sequence_create(seq_base_type, "raw_len");
1087         if (!seq_type)
1088                 return -1;
1089
1090         return bt_ctf_event_class_add_field(class, seq_type, "raw_data");
1091 }
1092
1093 static int add_generic_types(struct ctf_writer *cw, struct evsel *evsel,
1094                              struct bt_ctf_event_class *event_class)
1095 {
1096         u64 type = evsel->core.attr.sample_type;
1097
1098         /*
1099          * missing:
1100          *   PERF_SAMPLE_TIME         - not needed as we have it in
1101          *                              ctf event header
1102          *   PERF_SAMPLE_READ         - TODO
1103          *   PERF_SAMPLE_CALLCHAIN    - TODO
1104          *   PERF_SAMPLE_RAW          - tracepoint fields and BPF output
1105          *                              are handled separately
1106          *   PERF_SAMPLE_BRANCH_STACK - TODO
1107          *   PERF_SAMPLE_REGS_USER    - TODO
1108          *   PERF_SAMPLE_STACK_USER   - TODO
1109          */
1110
1111 #define ADD_FIELD(cl, t, n)                                             \
1112         do {                                                            \
1113                 pr2("  field '%s'\n", n);                               \
1114                 if (bt_ctf_event_class_add_field(cl, t, n)) {           \
1115                         pr_err("Failed to add field '%s';\n", n);       \
1116                         return -1;                                      \
1117                 }                                                       \
1118         } while (0)
1119
1120         if (type & PERF_SAMPLE_IP)
1121                 ADD_FIELD(event_class, cw->data.u64_hex, "perf_ip");
1122
1123         if (type & PERF_SAMPLE_TID) {
1124                 ADD_FIELD(event_class, cw->data.s32, "perf_tid");
1125                 ADD_FIELD(event_class, cw->data.s32, "perf_pid");
1126         }
1127
1128         if ((type & PERF_SAMPLE_ID) ||
1129             (type & PERF_SAMPLE_IDENTIFIER))
1130                 ADD_FIELD(event_class, cw->data.u64, "perf_id");
1131
1132         if (type & PERF_SAMPLE_STREAM_ID)
1133                 ADD_FIELD(event_class, cw->data.u64, "perf_stream_id");
1134
1135         if (type & PERF_SAMPLE_PERIOD)
1136                 ADD_FIELD(event_class, cw->data.u64, "perf_period");
1137
1138         if (type & PERF_SAMPLE_WEIGHT)
1139                 ADD_FIELD(event_class, cw->data.u64, "perf_weight");
1140
1141         if (type & PERF_SAMPLE_DATA_SRC)
1142                 ADD_FIELD(event_class, cw->data.u64, "perf_data_src");
1143
1144         if (type & PERF_SAMPLE_TRANSACTION)
1145                 ADD_FIELD(event_class, cw->data.u64, "perf_transaction");
1146
1147         if (type & PERF_SAMPLE_CALLCHAIN) {
1148                 ADD_FIELD(event_class, cw->data.u32, "perf_callchain_size");
1149                 ADD_FIELD(event_class,
1150                         bt_ctf_field_type_sequence_create(
1151                                 cw->data.u64_hex, "perf_callchain_size"),
1152                         "perf_callchain");
1153         }
1154
1155 #undef ADD_FIELD
1156         return 0;
1157 }
1158
1159 static int add_event(struct ctf_writer *cw, struct evsel *evsel)
1160 {
1161         struct bt_ctf_event_class *event_class;
1162         struct evsel_priv *priv;
1163         const char *name = evsel__name(evsel);
1164         int ret;
1165
1166         pr("Adding event '%s' (type %d)\n", name, evsel->core.attr.type);
1167
1168         event_class = bt_ctf_event_class_create(name);
1169         if (!event_class)
1170                 return -1;
1171
1172         ret = add_generic_types(cw, evsel, event_class);
1173         if (ret)
1174                 goto err;
1175
1176         if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT) {
1177                 ret = add_tracepoint_types(cw, evsel, event_class);
1178                 if (ret)
1179                         goto err;
1180         }
1181
1182         if (evsel__is_bpf_output(evsel)) {
1183                 ret = add_bpf_output_types(cw, event_class);
1184                 if (ret)
1185                         goto err;
1186         }
1187
1188         ret = bt_ctf_stream_class_add_event_class(cw->stream_class, event_class);
1189         if (ret) {
1190                 pr("Failed to add event class into stream.\n");
1191                 goto err;
1192         }
1193
1194         priv = malloc(sizeof(*priv));
1195         if (!priv)
1196                 goto err;
1197
1198         priv->event_class = event_class;
1199         evsel->priv       = priv;
1200         return 0;
1201
1202 err:
1203         bt_ctf_event_class_put(event_class);
1204         pr_err("Failed to add event '%s'.\n", name);
1205         return -1;
1206 }
1207
1208 static int setup_events(struct ctf_writer *cw, struct perf_session *session)
1209 {
1210         struct evlist *evlist = session->evlist;
1211         struct evsel *evsel;
1212         int ret;
1213
1214         evlist__for_each_entry(evlist, evsel) {
1215                 ret = add_event(cw, evsel);
1216                 if (ret)
1217                         return ret;
1218         }
1219         return 0;
1220 }
1221
1222 #define __NON_SAMPLE_ADD_FIELD(t, n)                                            \
1223         do {                                                    \
1224                 pr2("  field '%s'\n", #n);                      \
1225                 if (bt_ctf_event_class_add_field(event_class, cw->data.t, #n)) {\
1226                         pr_err("Failed to add field '%s';\n", #n);\
1227                         return -1;                              \
1228                 }                                               \
1229         } while(0)
1230
1231 #define __FUNC_ADD_NON_SAMPLE_EVENT_CLASS(_name, body)          \
1232 static int add_##_name##_event(struct ctf_writer *cw)           \
1233 {                                                               \
1234         struct bt_ctf_event_class *event_class;                 \
1235         int ret;                                                \
1236                                                                 \
1237         pr("Adding "#_name" event\n");                          \
1238         event_class = bt_ctf_event_class_create("perf_" #_name);\
1239         if (!event_class)                                       \
1240                 return -1;                                      \
1241         body                                                    \
1242                                                                 \
1243         ret = bt_ctf_stream_class_add_event_class(cw->stream_class, event_class);\
1244         if (ret) {                                              \
1245                 pr("Failed to add event class '"#_name"' into stream.\n");\
1246                 return ret;                                     \
1247         }                                                       \
1248                                                                 \
1249         cw->_name##_class = event_class;                        \
1250         bt_ctf_event_class_put(event_class);                    \
1251         return 0;                                               \
1252 }
1253
1254 __FUNC_ADD_NON_SAMPLE_EVENT_CLASS(comm,
1255         __NON_SAMPLE_ADD_FIELD(u32, pid);
1256         __NON_SAMPLE_ADD_FIELD(u32, tid);
1257         __NON_SAMPLE_ADD_FIELD(string, comm);
1258 )
1259
1260 __FUNC_ADD_NON_SAMPLE_EVENT_CLASS(fork,
1261         __NON_SAMPLE_ADD_FIELD(u32, pid);
1262         __NON_SAMPLE_ADD_FIELD(u32, ppid);
1263         __NON_SAMPLE_ADD_FIELD(u32, tid);
1264         __NON_SAMPLE_ADD_FIELD(u32, ptid);
1265         __NON_SAMPLE_ADD_FIELD(u64, time);
1266 )
1267
1268 __FUNC_ADD_NON_SAMPLE_EVENT_CLASS(exit,
1269         __NON_SAMPLE_ADD_FIELD(u32, pid);
1270         __NON_SAMPLE_ADD_FIELD(u32, ppid);
1271         __NON_SAMPLE_ADD_FIELD(u32, tid);
1272         __NON_SAMPLE_ADD_FIELD(u32, ptid);
1273         __NON_SAMPLE_ADD_FIELD(u64, time);
1274 )
1275
1276 __FUNC_ADD_NON_SAMPLE_EVENT_CLASS(mmap,
1277         __NON_SAMPLE_ADD_FIELD(u32, pid);
1278         __NON_SAMPLE_ADD_FIELD(u32, tid);
1279         __NON_SAMPLE_ADD_FIELD(u64_hex, start);
1280         __NON_SAMPLE_ADD_FIELD(string, filename);
1281 )
1282
1283 __FUNC_ADD_NON_SAMPLE_EVENT_CLASS(mmap2,
1284         __NON_SAMPLE_ADD_FIELD(u32, pid);
1285         __NON_SAMPLE_ADD_FIELD(u32, tid);
1286         __NON_SAMPLE_ADD_FIELD(u64_hex, start);
1287         __NON_SAMPLE_ADD_FIELD(string, filename);
1288 )
1289 #undef __NON_SAMPLE_ADD_FIELD
1290 #undef __FUNC_ADD_NON_SAMPLE_EVENT_CLASS
1291
1292 static int setup_non_sample_events(struct ctf_writer *cw,
1293                                    struct perf_session *session __maybe_unused)
1294 {
1295         int ret;
1296
1297         ret = add_comm_event(cw);
1298         if (ret)
1299                 return ret;
1300         ret = add_exit_event(cw);
1301         if (ret)
1302                 return ret;
1303         ret = add_fork_event(cw);
1304         if (ret)
1305                 return ret;
1306         ret = add_mmap_event(cw);
1307         if (ret)
1308                 return ret;
1309         ret = add_mmap2_event(cw);
1310         if (ret)
1311                 return ret;
1312         return 0;
1313 }
1314
1315 static void cleanup_events(struct perf_session *session)
1316 {
1317         struct evlist *evlist = session->evlist;
1318         struct evsel *evsel;
1319
1320         evlist__for_each_entry(evlist, evsel) {
1321                 struct evsel_priv *priv;
1322
1323                 priv = evsel->priv;
1324                 bt_ctf_event_class_put(priv->event_class);
1325                 zfree(&evsel->priv);
1326         }
1327
1328         evlist__delete(evlist);
1329         session->evlist = NULL;
1330 }
1331
1332 static int setup_streams(struct ctf_writer *cw, struct perf_session *session)
1333 {
1334         struct ctf_stream **stream;
1335         struct perf_header *ph = &session->header;
1336         int ncpus;
1337
1338         /*
1339          * Try to get the number of cpus used in the data file,
1340          * if not present fallback to the MAX_CPUS.
1341          */
1342         ncpus = ph->env.nr_cpus_avail ?: MAX_CPUS;
1343
1344         stream = zalloc(sizeof(*stream) * ncpus);
1345         if (!stream) {
1346                 pr_err("Failed to allocate streams.\n");
1347                 return -ENOMEM;
1348         }
1349
1350         cw->stream     = stream;
1351         cw->stream_cnt = ncpus;
1352         return 0;
1353 }
1354
1355 static void free_streams(struct ctf_writer *cw)
1356 {
1357         int cpu;
1358
1359         for (cpu = 0; cpu < cw->stream_cnt; cpu++)
1360                 ctf_stream__delete(cw->stream[cpu]);
1361
1362         zfree(&cw->stream);
1363 }
1364
1365 static int ctf_writer__setup_env(struct ctf_writer *cw,
1366                                  struct perf_session *session)
1367 {
1368         struct perf_header *header = &session->header;
1369         struct bt_ctf_writer *writer = cw->writer;
1370
1371 #define ADD(__n, __v)                                                   \
1372 do {                                                                    \
1373         if (bt_ctf_writer_add_environment_field(writer, __n, __v))      \
1374                 return -1;                                              \
1375 } while (0)
1376
1377         ADD("host",    header->env.hostname);
1378         ADD("sysname", "Linux");
1379         ADD("release", header->env.os_release);
1380         ADD("version", header->env.version);
1381         ADD("machine", header->env.arch);
1382         ADD("domain", "kernel");
1383         ADD("tracer_name", "perf");
1384
1385 #undef ADD
1386         return 0;
1387 }
1388
1389 static int ctf_writer__setup_clock(struct ctf_writer *cw,
1390                                    struct perf_session *session,
1391                                    bool tod)
1392 {
1393         struct bt_ctf_clock *clock = cw->clock;
1394         const char *desc = "perf clock";
1395         int64_t offset = 0;
1396
1397         if (tod) {
1398                 struct perf_env *env = &session->header.env;
1399
1400                 if (!env->clock.enabled) {
1401                         pr_err("Can't provide --tod time, missing clock data. "
1402                                "Please record with -k/--clockid option.\n");
1403                         return -1;
1404                 }
1405
1406                 desc   = clockid_name(env->clock.clockid);
1407                 offset = env->clock.tod_ns - env->clock.clockid_ns;
1408         }
1409
1410 #define SET(__n, __v)                           \
1411 do {                                            \
1412         if (bt_ctf_clock_set_##__n(clock, __v)) \
1413                 return -1;                      \
1414 } while (0)
1415
1416         SET(frequency,   1000000000);
1417         SET(offset,      offset);
1418         SET(description, desc);
1419         SET(precision,   10);
1420         SET(is_absolute, 0);
1421
1422 #undef SET
1423         return 0;
1424 }
1425
1426 static struct bt_ctf_field_type *create_int_type(int size, bool sign, bool hex)
1427 {
1428         struct bt_ctf_field_type *type;
1429
1430         type = bt_ctf_field_type_integer_create(size);
1431         if (!type)
1432                 return NULL;
1433
1434         if (sign &&
1435             bt_ctf_field_type_integer_set_signed(type, 1))
1436                 goto err;
1437
1438         if (hex &&
1439             bt_ctf_field_type_integer_set_base(type, BT_CTF_INTEGER_BASE_HEXADECIMAL))
1440                 goto err;
1441
1442 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
1443         bt_ctf_field_type_set_byte_order(type, BT_CTF_BYTE_ORDER_BIG_ENDIAN);
1444 #else
1445         bt_ctf_field_type_set_byte_order(type, BT_CTF_BYTE_ORDER_LITTLE_ENDIAN);
1446 #endif
1447
1448         pr2("Created type: INTEGER %d-bit %ssigned %s\n",
1449             size, sign ? "un" : "", hex ? "hex" : "");
1450         return type;
1451
1452 err:
1453         bt_ctf_field_type_put(type);
1454         return NULL;
1455 }
1456
1457 static void ctf_writer__cleanup_data(struct ctf_writer *cw)
1458 {
1459         unsigned int i;
1460
1461         for (i = 0; i < ARRAY_SIZE(cw->data.array); i++)
1462                 bt_ctf_field_type_put(cw->data.array[i]);
1463 }
1464
1465 static int ctf_writer__init_data(struct ctf_writer *cw)
1466 {
1467 #define CREATE_INT_TYPE(type, size, sign, hex)          \
1468 do {                                                    \
1469         (type) = create_int_type(size, sign, hex);      \
1470         if (!(type))                                    \
1471                 goto err;                               \
1472 } while (0)
1473
1474         CREATE_INT_TYPE(cw->data.s64, 64, true,  false);
1475         CREATE_INT_TYPE(cw->data.u64, 64, false, false);
1476         CREATE_INT_TYPE(cw->data.s32, 32, true,  false);
1477         CREATE_INT_TYPE(cw->data.u32, 32, false, false);
1478         CREATE_INT_TYPE(cw->data.u32_hex, 32, false, true);
1479         CREATE_INT_TYPE(cw->data.u64_hex, 64, false, true);
1480
1481         cw->data.string  = bt_ctf_field_type_string_create();
1482         if (cw->data.string)
1483                 return 0;
1484
1485 err:
1486         ctf_writer__cleanup_data(cw);
1487         pr_err("Failed to create data types.\n");
1488         return -1;
1489 }
1490
1491 static void ctf_writer__cleanup(struct ctf_writer *cw)
1492 {
1493         ctf_writer__cleanup_data(cw);
1494
1495         bt_ctf_clock_put(cw->clock);
1496         free_streams(cw);
1497         bt_ctf_stream_class_put(cw->stream_class);
1498         bt_ctf_writer_put(cw->writer);
1499
1500         /* and NULL all the pointers */
1501         memset(cw, 0, sizeof(*cw));
1502 }
1503
1504 static int ctf_writer__init(struct ctf_writer *cw, const char *path,
1505                             struct perf_session *session, bool tod)
1506 {
1507         struct bt_ctf_writer            *writer;
1508         struct bt_ctf_stream_class      *stream_class;
1509         struct bt_ctf_clock             *clock;
1510         struct bt_ctf_field_type        *pkt_ctx_type;
1511         int                             ret;
1512
1513         /* CTF writer */
1514         writer = bt_ctf_writer_create(path);
1515         if (!writer)
1516                 goto err;
1517
1518         cw->writer = writer;
1519
1520         /* CTF clock */
1521         clock = bt_ctf_clock_create("perf_clock");
1522         if (!clock) {
1523                 pr("Failed to create CTF clock.\n");
1524                 goto err_cleanup;
1525         }
1526
1527         cw->clock = clock;
1528
1529         if (ctf_writer__setup_clock(cw, session, tod)) {
1530                 pr("Failed to setup CTF clock.\n");
1531                 goto err_cleanup;
1532         }
1533
1534         /* CTF stream class */
1535         stream_class = bt_ctf_stream_class_create("perf_stream");
1536         if (!stream_class) {
1537                 pr("Failed to create CTF stream class.\n");
1538                 goto err_cleanup;
1539         }
1540
1541         cw->stream_class = stream_class;
1542
1543         /* CTF clock stream setup */
1544         if (bt_ctf_stream_class_set_clock(stream_class, clock)) {
1545                 pr("Failed to assign CTF clock to stream class.\n");
1546                 goto err_cleanup;
1547         }
1548
1549         if (ctf_writer__init_data(cw))
1550                 goto err_cleanup;
1551
1552         /* Add cpu_id for packet context */
1553         pkt_ctx_type = bt_ctf_stream_class_get_packet_context_type(stream_class);
1554         if (!pkt_ctx_type)
1555                 goto err_cleanup;
1556
1557         ret = bt_ctf_field_type_structure_add_field(pkt_ctx_type, cw->data.u32, "cpu_id");
1558         bt_ctf_field_type_put(pkt_ctx_type);
1559         if (ret)
1560                 goto err_cleanup;
1561
1562         /* CTF clock writer setup */
1563         if (bt_ctf_writer_add_clock(writer, clock)) {
1564                 pr("Failed to assign CTF clock to writer.\n");
1565                 goto err_cleanup;
1566         }
1567
1568         return 0;
1569
1570 err_cleanup:
1571         ctf_writer__cleanup(cw);
1572 err:
1573         pr_err("Failed to setup CTF writer.\n");
1574         return -1;
1575 }
1576
1577 static int ctf_writer__flush_streams(struct ctf_writer *cw)
1578 {
1579         int cpu, ret = 0;
1580
1581         for (cpu = 0; cpu < cw->stream_cnt && !ret; cpu++)
1582                 ret = ctf_stream__flush(cw->stream[cpu]);
1583
1584         return ret;
1585 }
1586
1587 static int convert__config(const char *var, const char *value, void *cb)
1588 {
1589         struct convert *c = cb;
1590
1591         if (!strcmp(var, "convert.queue-size"))
1592                 return perf_config_u64(&c->queue_size, var, value);
1593
1594         return 0;
1595 }
1596
1597 int bt_convert__perf2ctf(const char *input, const char *path,
1598                          struct perf_data_convert_opts *opts)
1599 {
1600         struct perf_session *session;
1601         struct perf_data data = {
1602                 .path      = input,
1603                 .mode      = PERF_DATA_MODE_READ,
1604                 .force     = opts->force,
1605         };
1606         struct convert c = {
1607                 .tool = {
1608                         .sample          = process_sample_event,
1609                         .mmap            = perf_event__process_mmap,
1610                         .mmap2           = perf_event__process_mmap2,
1611                         .comm            = perf_event__process_comm,
1612                         .exit            = perf_event__process_exit,
1613                         .fork            = perf_event__process_fork,
1614                         .lost            = perf_event__process_lost,
1615                         .tracing_data    = perf_event__process_tracing_data,
1616                         .build_id        = perf_event__process_build_id,
1617                         .namespaces      = perf_event__process_namespaces,
1618                         .ordered_events  = true,
1619                         .ordering_requires_timestamps = true,
1620                 },
1621         };
1622         struct ctf_writer *cw = &c.writer;
1623         int err;
1624
1625         if (opts->all) {
1626                 c.tool.comm = process_comm_event;
1627                 c.tool.exit = process_exit_event;
1628                 c.tool.fork = process_fork_event;
1629                 c.tool.mmap = process_mmap_event;
1630                 c.tool.mmap2 = process_mmap2_event;
1631         }
1632
1633         err = perf_config(convert__config, &c);
1634         if (err)
1635                 return err;
1636
1637         err = -1;
1638         /* perf.data session */
1639         session = perf_session__new(&data, &c.tool);
1640         if (IS_ERR(session))
1641                 return PTR_ERR(session);
1642
1643         /* CTF writer */
1644         if (ctf_writer__init(cw, path, session, opts->tod))
1645                 goto free_session;
1646
1647         if (c.queue_size) {
1648                 ordered_events__set_alloc_size(&session->ordered_events,
1649                                                c.queue_size);
1650         }
1651
1652         /* CTF writer env/clock setup  */
1653         if (ctf_writer__setup_env(cw, session))
1654                 goto free_writer;
1655
1656         /* CTF events setup */
1657         if (setup_events(cw, session))
1658                 goto free_writer;
1659
1660         if (opts->all && setup_non_sample_events(cw, session))
1661                 goto free_writer;
1662
1663         if (setup_streams(cw, session))
1664                 goto free_writer;
1665
1666         err = perf_session__process_events(session);
1667         if (!err)
1668                 err = ctf_writer__flush_streams(cw);
1669         else
1670                 pr_err("Error during conversion.\n");
1671
1672         fprintf(stderr,
1673                 "[ perf data convert: Converted '%s' into CTF data '%s' ]\n",
1674                 data.path, path);
1675
1676         fprintf(stderr,
1677                 "[ perf data convert: Converted and wrote %.3f MB (%" PRIu64 " samples",
1678                 (double) c.events_size / 1024.0 / 1024.0,
1679                 c.events_count);
1680
1681         if (!c.non_sample_count)
1682                 fprintf(stderr, ") ]\n");
1683         else
1684                 fprintf(stderr, ", %" PRIu64 " non-samples) ]\n", c.non_sample_count);
1685
1686         cleanup_events(session);
1687         perf_session__delete(session);
1688         ctf_writer__cleanup(cw);
1689
1690         return err;
1691
1692 free_writer:
1693         ctf_writer__cleanup(cw);
1694 free_session:
1695         perf_session__delete(session);
1696         pr_err("Error during conversion setup.\n");
1697         return err;
1698 }