blob: 72e3e68eebab58bf6c080edce336be1bb73edc46 [file] [log] [blame]
/* Copyright (c) 2014 The Regents of the University of California
* Barret Rhoden <brho@cs.berkeley.edu>
* See LICENSE for details.
*
* Linker functions. These are functions of type void func(void) that are
* automatically run during the kernel initialization.
*
* There are different levels; the functions of lower levels are run before
* higher levels. There is no guarantee of ordering of functions within a
* level.
*
* To use, change your function definition to use the appropriate macro, e.g.
*
* void foo(void)
* {
* bar();
* }
*
* becomes
*
* linker_func_3(foo)
* {
* bar();
* }
*
* And foo() will run during the third level of functions.
*
* For now, all levels are run sequentially, and with interrupts enabled. */
#pragma once
#define __linkerfunc1 __attribute__((__section__(".linkerfunc1")))
#define __linkerfunc2 __attribute__((__section__(".linkerfunc2")))
#define __linkerfunc3 __attribute__((__section__(".linkerfunc3")))
#define __linkerfunc4 __attribute__((__section__(".linkerfunc4")))
typedef void (*linker_func_t)(void);
#define linker_func_1(x) \
void (x)(void); \
linker_func_t __linkerfunc1 __##x = (x); \
void (x)(void)
#define linker_func_2(x) \
void (x)(void); \
linker_func_t __linkerfunc2 __##x = (x); \
void (x)(void)
#define linker_func_3(x) \
void (x)(void); \
linker_func_t __linkerfunc3 __##x = (x); \
void (x)(void)
#define linker_func_4(x) \
void (x)(void); \
linker_func_t __linkerfunc4 __##x = (x); \
void (x)(void)
extern linker_func_t __linkerfunc1start[];
extern linker_func_t __linkerfunc1end[];
extern linker_func_t __linkerfunc2start[];
extern linker_func_t __linkerfunc2end[];
extern linker_func_t __linkerfunc3start[];
extern linker_func_t __linkerfunc3end[];
extern linker_func_t __linkerfunc4start[];
extern linker_func_t __linkerfunc4end[];