perf: Treat the kernel like [kernel.kallsyms]
[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 mem_arena ma;
64         int debug_level;
65         struct static_mmap64 *static_mmaps;
66         uint64_t sqnr_id;
67         struct perf_event_id *events;
68         size_t alloced_events;
69         struct perf_header ph;
70         struct perf_headers hdrs;
71         struct mem_file fhdrs, misc, attrs, data, event_types;
72 };
73
74 struct perfconv_context *perfconv_create_context(void);
75 void perfconv_free_context(struct perfconv_context *cctx);
76 void perfconv_set_dbglevel(int level, struct perfconv_context *cctx);
77 void perfconv_add_kernel_mmap(struct perfconv_context *cctx);
78 void perfconv_process_input(struct perfconv_context *cctx, FILE *input,
79                                                         FILE *output);