vmm: Add noht to vmimage_cmdline
[akaros.git] / kern / src / percpu.c
1 /* Copyright (c) 2015 Google Inc
2  * Davide Libenzi <dlibenzi@google.com>
3  * See LICENSE for details.
4  */
5
6 #include <sys/types.h>
7 #include <arch/topology.h>
8 #include <kmalloc.h>
9 #include <stdio.h>
10 #include <assert.h>
11 #include <string.h>
12 #include <percpu.h>
13
14 char *percpu_base;
15
16 static void run_init_functions(void)
17 {
18         extern char __attribute__((weak)) PERCPU_INIT_START_VAR[];
19         extern char __attribute__((weak)) PERCPU_INIT_STOP_VAR[];
20
21         if (PERCPU_INIT_START_VAR) {
22                 void (**pfunc)(void) = (void (**)(void)) PERCPU_INIT_START_VAR;
23                 void (**pfunc_top)(void) = (void (**)(void)) PERCPU_INIT_STOP_VAR;
24
25                 for (; pfunc < pfunc_top; pfunc++)
26                         (*pfunc)();
27         }
28 }
29
30 void percpu_init(void)
31 {
32         assert(num_cores > 0);
33         percpu_base = kmalloc(num_cores * PERCPU_SIZE, 0);
34         assert(percpu_base);
35
36         if (PERCPU_START_VAR) {
37                 for (int i = 0; i < num_cores; i++)
38                         memcpy(percpu_base + i * PERCPU_SIZE, PERCPU_START_VAR,
39                                    PERCPU_SIZE);
40         }
41         run_init_functions();
42 }