kconfig: use pkg-config for ncurses detection
[akaros.git] / kern / include / linker_func.h
1 /* Copyright (c) 2014 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Linker functions.  These are functions of type void func(void) that are
6  * automatically run during the kernel initialization.
7  *
8  * There are different levels; the functions of lower levels are run before
9  * higher levels.  There is no guarantee of ordering of functions within a
10  * level.
11  *
12  * To use, simply add the __init tag and the appropriate init_func_X(func);
13  *
14  *              static void foo(void)
15  *              {
16  *                      bar();
17  *              }
18  *
19  * becomes
20  *
21  *              static void __init foo(void)
22  *              {
23  *                      bar();
24  *              }
25  *              init_func_3(foo);
26  *
27  * And foo() will run during the third level of functions.
28  *
29  * For now, all levels are run sequentially, and with interrupts enabled. */
30
31 #pragma once
32
33 #define __init
34
35 #define __linkerfunc1  __attribute__((__section__(".linkerfunc1")))
36 #define __linkerfunc2  __attribute__((__section__(".linkerfunc2")))
37 #define __linkerfunc3  __attribute__((__section__(".linkerfunc3")))
38 #define __linkerfunc4  __attribute__((__section__(".linkerfunc4")))
39
40 typedef void (*linker_func_t)(void);
41
42 /* Casting for the sake of Linux functions, which return an int. */
43 #define init_func_1(x) linker_func_t __linkerfunc1 __##x = (linker_func_t)(x);
44 #define init_func_2(x) linker_func_t __linkerfunc2 __##x = (linker_func_t)(x);
45 #define init_func_3(x) linker_func_t __linkerfunc3 __##x = (linker_func_t)(x);
46 #define init_func_4(x) linker_func_t __linkerfunc4 __##x = (linker_func_t)(x);
47
48 extern linker_func_t __linkerfunc1start[];
49 extern linker_func_t __linkerfunc1end[];
50 extern linker_func_t __linkerfunc2start[];
51 extern linker_func_t __linkerfunc2end[];
52 extern linker_func_t __linkerfunc3start[];
53 extern linker_func_t __linkerfunc3end[];
54 extern linker_func_t __linkerfunc4start[];
55 extern linker_func_t __linkerfunc4end[];