/* 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[];
