/* 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. */

#ifndef ROS_KERN_LINKER_FUNC_H
#define ROS_KERN_LINKER_FUNC_H

#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[];

#endif /* ROS_KERN_LINKER_FUNC_H */
