perf: Track the perf_context when converting
[akaros.git] / tools / profile / perf / perfconv.h
1 /* Copyright (c) 2015 Google Inc
2  * Davide Libenzi <dlibenzi@google.com>
3  * See LICENSE for details.
4  *
5  * Converts kprof profiler files into Linux perf ones. The Linux Perf file
6  * format has bee illustrated here:
7  *
8  *       https://lwn.net/Articles/644919/
9  *       https://openlab-mu-internal.web.cern.ch/openlab-mu-internal/03_Documents/
10  *                       3_Technical_Documents/Technical_Reports/2011/Urs_Fassler_report.pdf
11  *
12  */
13
14 #pragma once
15
16 #include <sys/types.h>
17 #include <stdio.h>
18 #include <stdint.h>
19 #include "xlib.h"
20 #include "perf_format.h"
21
22 struct mem_file_reloc {
23         struct mem_file_reloc *next;
24         uint64_t *ptr;
25 };
26
27 struct mem_block {
28         struct mem_block *next;
29         char *base;
30         char *top;
31         char *wptr;
32 };
33
34 struct mem_file {
35         struct mem_arena *ma;
36         size_t size;
37         struct mem_block *head;
38         struct mem_block *tail;
39         struct mem_file_reloc *relocs;
40 };
41
42 struct static_mmap64 {
43         struct static_mmap64 *next;
44         uint64_t addr;
45         uint64_t size;
46         uint64_t offset;
47         uint32_t pid;
48         uint32_t tid;
49         uint16_t header_misc;
50         char *path;
51 };
52
53 struct perf_headers {
54         struct mem_block *headers[HEADER_FEAT_BITS];
55 };
56
57 struct perf_event_id {
58         uint64_t event;
59         uint64_t id;
60 };
61
62 struct perfconv_context {
63         struct perf_context *pctx;
64         struct mem_arena ma;
65         int debug_level;
66         struct static_mmap64 *static_mmaps;
67         uint64_t sqnr_id;
68         struct perf_event_id *events;
69         size_t alloced_events;
70         struct perf_header ph;
71         struct perf_headers hdrs;
72         struct mem_file fhdrs, misc, attrs, data, event_types;
73 };
74
75 struct perfconv_context *perfconv_create_context(struct perf_context *pctx);
76 void perfconv_free_context(struct perfconv_context *cctx);
77 void perfconv_set_dbglevel(int level, struct perfconv_context *cctx);
78 void perfconv_add_kernel_mmap(struct perfconv_context *cctx);
79 void perfconv_process_input(struct perfconv_context *cctx, FILE *input,
80                                                         FILE *output);