1#include <console/panic.h>
2#include <global.h>
3#include <mem/alloc.h>
4#include <mem/alloc_or_die.h>
5#include <smp/core.h>
6#include <smp/domain.h>
7#include <smp/percpu.h>
8#include <smp/perdomain.h>
9#include <smp/pernode.h>
10
11void percpu_obj_init(void) {
12 for (struct percpu_descriptor *d = __skernel_percpu_desc;
13 d < __ekernel_percpu_desc; d++) {
14 d->percpu_ptrs = kmalloc_or_die(sizeof(void *) * global.core_count);
15
16 size_t cpu;
17 for_each_cpu_id(cpu) {
18 d->percpu_ptrs[cpu] = alloc_or_die(
19 kmalloc_aligned(d->size, d->align, ALLOC_FLAGS_ZERO));
20
21 if (d->constructor)
22 d->constructor(d->percpu_ptrs[cpu], cpu);
23 }
24 }
25}
26
27void perdomain_obj_init(void) {
28 for (struct perdomain_descriptor *d = __skernel_perdomain_desc;
29 d < __ekernel_perdomain_desc; d++) {
30 d->perdomain_ptrs =
31 kmalloc_or_die(sizeof(void *) * global.domain_count);
32
33 struct domain *dom;
34 domain_for_each_domain(dom) {
35 size_t id = dom->id;
36 d->perdomain_ptrs[id] = alloc_or_die(
37 kmalloc_aligned(d->size, d->align, ALLOC_FLAGS_ZERO));
38
39 if (d->constructor)
40 d->constructor(d->perdomain_ptrs[id], id);
41 }
42 }
43}
44
45void pernode_obj_init(void) {
46 for (struct pernode_descriptor *d = __skernel_pernode_desc;
47 d < __ekernel_pernode_desc; d++) {
48 d->pernode_ptrs =
49 kmalloc_or_die(sizeof(void *) * global.numa_node_count);
50
51 for (size_t i = 0; i < global.numa_node_count; i++) {
52 d->pernode_ptrs[i] = alloc_or_die(
53 kmalloc_aligned(d->size, d->align, ALLOC_FLAGS_ZERO));
54 if (d->constructor)
55 d->constructor(d->pernode_ptrs[i], i);
56 }
57 }
58}
59