Added new perf utility to access CPU counters from userspace
[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
17 #define MAX_CPU_EVENTS 256
18
19 struct perf_arch_info {
20         uint32_t perfmon_version;
21         uint32_t proc_arch_events;
22         uint32_t bits_x_counter;
23         uint32_t counters_x_proc;
24         uint32_t bits_x_fix_counter;
25         uint32_t fix_counters_x_proc;
26 };
27
28 struct perf_eventsel {
29         struct perfmon_event ev;
30         int eidx;
31 };
32
33 struct perf_event {
34         struct core_set cores;
35         struct perf_eventsel sel;
36         int ped;
37 };
38
39 struct perf_context {
40         int perf_fd;
41         int kpctl_fd;
42         struct perf_arch_info pai;
43         int event_count;
44         struct perf_event events[MAX_CPU_EVENTS];
45 };
46
47 struct perf_context_config {
48         const char *perf_file;
49         const char *kpctl_file;
50 };
51
52 void perf_initialize(int argc, const char * const *argv);
53 void perf_finalize(void);
54 void perf_parse_event(const char *str, struct perf_eventsel *sel);
55 struct perf_context *perf_create_context(const struct perf_context_config *cfg);
56 void perf_free_context(struct perf_context *pctx);
57 void perf_context_event_submit(struct perf_context *pctx,
58                                                            const struct core_set *cores,
59                                                            const struct perf_eventsel *sel);
60 void perf_context_show_values(struct perf_context *pctx, FILE *file);
61 void perf_show_events(const char *rx, FILE *file);
62 void perf_get_event_string(const struct perf_eventsel *sel, char *sbuf,
63                                                    size_t size);
64
65 static inline const struct perf_arch_info *perf_context_get_arch_info(
66         const struct perf_context *pctx)
67 {
68         return &pctx->pai;
69 }