1/* @title: Domains */
2#pragma once
3#include <smp/core.h>
4#include <stdint.h>
5
6/* For UMA */
7#define CORES_PER_DOMAIN 4
8
9struct domain {
10 size_t id;
11 size_t num_cores;
12 struct core **cores;
13 struct numa_node *associated_node;
14 struct slab_domain *slab_domain;
15 struct domain_buddy *domain_buddy;
16 struct cpu_mask cpu_mask;
17};
18
19static inline struct domain *domain_local(void) {
20 return smp_core()->domain;
21}
22
23static inline size_t domain_local_id(void) {
24 return domain_local()->id;
25}
26
27void domain_init(void);
28struct cpu_mask *domain_create_cpu_mask(struct domain *domain);
29void domain_set_cpu_mask(struct cpu_mask *mask, struct domain *domain);
30bool domain_idle(struct domain *domain);
31size_t domain_for_core(size_t cpu);
32void domain_init_after_smp();
33void domain_dump(void);
34
35#define domain_for_each_domain(__dom) \
36 for (size_t __i = 0; \
37 (__dom = global.domains[__i]), (__i < global.domain_count); __i++)
38
39#define domain_for_each_core(__dom, __pos) \
40 for (size_t __i = 0; \
41 (__pos = __dom->cores[__i]), (__i < __dom->num_cores); __i++)
42
43#define domain_for_each_core_local(__pos) \
44 domain_for_each_core(smp_core()->domain, __pos)
45