Implement pipes in userspace (XCC)
[akaros.git] / kern / include / core_set.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 <arch/arch.h>
9 #include <arch/topology.h>
10 #include <ros/common.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <bitops.h>
14
15 struct core_set {
16         unsigned long cpus[DIV_ROUND_UP(MAX_NUM_CORES, BITS_PER_LONG)];
17 };
18
19 static inline void core_set_init(struct core_set *cset)
20 {
21         memset(cset, 0, sizeof(*cset));
22 }
23
24 static inline void core_set_setcpu(struct core_set *cset, unsigned int cpuno)
25 {
26         __set_bit(cpuno, cset->cpus);
27 }
28
29 static inline void core_set_clearcpu(struct core_set *cset, unsigned int cpuno)
30 {
31         __clear_bit(cpuno, cset->cpus);
32 }
33
34 static inline bool core_set_getcpu(const struct core_set *cset,
35                                                                   unsigned int cpuno)
36 {
37         return test_bit(cpuno, cset->cpus);
38 }
39
40 static inline void core_set_fill_available(struct core_set *cset)
41 {
42         for (int i = 0; i < num_cores; i++)
43                 core_set_setcpu(cset, i);
44 }
45
46 static inline int core_set_count(const struct core_set *cset)
47 {
48         int count = 0;
49
50         for (size_t i = 0; i < ARRAY_SIZE(cset->cpus); i++) {
51                 for (unsigned long v = cset->cpus[i]; v; v >>= 1)
52                         count += (int) (v & 1);
53         }
54
55         return count;
56 }
57
58 static inline int core_set_remote_count(const struct core_set *cset)
59 {
60         int count = core_set_count(cset), cpu = core_id();
61
62         return core_set_getcpu(cset, cpu) ? count - 1: count;
63 }