98c9779e011fe3df64f2eca753f9a2a7faa28109
[akaros.git] / tools / profile / perf / akaros.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/common.h>
10 #include <sys/types.h>
11 #include <stdint.h>
12 #include <stdio.h>
13 #include <limits.h>
14 #include <parlib/parlib.h>
15
16 #define CORE_SET_SIZE DIV_ROUND_UP(MAX_NUM_CORES, CHAR_BIT)
17
18 /* Not using sched.h CPU set because that file has definitions for a large
19  * number of APIs Akaros does not support.
20  * Making Akaros core_set.h visible in userslace might be a cleaner approach.
21  */
22 struct core_set {
23         uint8_t core_set[CORE_SET_SIZE];
24 };
25
26 void ros_get_low_latency_core_set(struct core_set *cores);
27 size_t ros_get_low_latency_core_count(void);
28 size_t ros_total_cores(void);
29 void ros_parse_cores(const char *str, struct core_set *cores);
30 void ros_get_all_cores_set(struct core_set *cores);
31 void ros_not_core_set(struct core_set *dcs);
32 void ros_and_core_sets(struct core_set *dcs, const struct core_set *scs);
33 void ros_or_core_sets(struct core_set *dcs, const struct core_set *scs);
34
35 static inline void ros_set_bit(void *addr, size_t nbit)
36 {
37         ((uint8_t *) addr)[nbit % CHAR_BIT] |= 1 << (nbit % CHAR_BIT);
38 }
39
40 static inline void ros_clear_bit(void *addr, size_t nbit)
41 {
42         ((uint8_t *) addr)[nbit % CHAR_BIT] &= ~(1 << (nbit % CHAR_BIT));
43 }
44
45 static inline bool ros_get_bit(const void *addr, size_t nbit)
46 {
47         return ((const uint8_t *) addr)[nbit % CHAR_BIT] & (1 << (nbit % CHAR_BIT));
48 }