perf: Delay the opening of kpctl
[akaros.git] / tools / profile / perf / perf_core.h
1 /* Copyright (c) 2015 Google Inc
2  * Davide Libenzi <dlibenzi@google.com>
3  * See LICENSE for details.
4  */
5
6 #pragma once
7
8 #include <ros/arch/arch.h>
9 #include <ros/arch/perfmon.h>
10 #include <ros/common.h>
11 #include <sys/types.h>
12 #include <stdint.h>
13 #include <stdio.h>
14 #include <limits.h>
15 #include "akaros.h"
16 #include "perfconv.h"
17
18 #define MAX_CPU_EVENTS 256
19
20 struct perf_arch_info {
21         uint32_t perfmon_version;
22         uint32_t proc_arch_events;
23         uint32_t bits_x_counter;
24         uint32_t counters_x_proc;
25         uint32_t bits_x_fix_counter;
26         uint32_t fix_counters_x_proc;
27 };
28
29 #define MAX_FQSTR_SZ 128
30 struct perf_eventsel {
31         struct perfmon_event ev;
32         bool attr_emitted;
33         uint32_t type;
34         uint64_t config;
35         char fq_str[MAX_FQSTR_SZ];
36 };
37
38 struct perf_event {
39         struct core_set cores;
40         struct perf_eventsel sel;
41         int ped;
42 };
43
44 struct perf_context_config {
45         const char *perf_file;
46         const char *kpctl_file;
47         const char *kpdata_file;
48 };
49
50 struct perf_context {
51         struct perf_context_config *cfg;
52         int perf_fd;
53         int kpctl_fd;
54         struct perf_arch_info pai;
55         int event_count;
56         struct perf_event events[MAX_CPU_EVENTS];
57 };
58
59 void perf_initialize(void);
60 void perf_finalize(void);
61 struct perf_eventsel *perf_parse_event(const char *str);
62 struct perf_context *perf_create_context(struct perf_context_config *cfg);
63 void perf_free_context(struct perf_context *pctx);
64 void perf_context_event_submit(struct perf_context *pctx,
65                                                            const struct core_set *cores,
66                                                            const struct perf_eventsel *sel);
67 void perf_stop_events(struct perf_context *pctx);
68 void perf_start_sampling(struct perf_context *pctx);
69 void perf_stop_sampling(struct perf_context *pctx);
70 uint64_t perf_get_event_count(struct perf_context *pctx, unsigned int idx);
71 void perf_context_show_values(struct perf_context *pctx, FILE *file);
72 void perf_show_events(const char *rx, FILE *file);
73 void perf_convert_trace_data(struct perfconv_context *cctx, const char *input,
74                                                          FILE *outfile);
75
76 static inline const struct perf_arch_info *perf_context_get_arch_info(
77         const struct perf_context *pctx)
78 {
79         return &pctx->pai;
80 }