Skip to content
Snippets Groups Projects
Commit fd6f8e29 authored by Armin Luntzer's avatar Armin Luntzer
Browse files

use same convention as in linux to define init calls

parent 9d3af19d
No related branches found
No related tags found
No related merge requests found
...@@ -6,11 +6,45 @@ ...@@ -6,11 +6,45 @@
#define _KERNEL_INIT_H_ #define _KERNEL_INIT_H_
typedef int (*initcall_t)(void); typedef int (*initcall_t)(void);
typedef void (*exitcall_t)(void);
/**
*
* We piggy-back on the (linux-style) initcall sections that BCC and
* GCC for the MPPB already have specified in their default linker scripts
* until we add our own.
*
* Since _call_initcalls() is executed by the libgloss bootup-code, use
* the initcalls in init/main.c to set up our system. Conventions are the same
* as in linux.
*
* They don't have sections for exitcalls, but we don't really need those for
* now.
*/
#define __define_initcall(fn, id) \
static initcall_t __initcall_##fn __attribute((used)) \
__attribute__((__section__(".initcall" #id ".init"))) = fn;
#if 0
#define __exitcall(fn) \
static exitcall_t __exitcall_##fn __attribute((used)) \
__attribute__((__section__(".exitcall.exit"))) = fn;
#else
#define __exitcall(fn)
#endif
#define core_initcall(fn) __define_initcall(fn, 1)
#define postcore_initcall(fn) __define_initcall(fn, 2)
#define arch_initcall(fn) __define_initcall(fn, 3)
#define subsys_initcall(fn) __define_initcall(fn, 4)
#define fs_initcall(fn) __define_initcall(fn, 5)
#define device_initcall(fn) __define_initcall(fn, 6)
#define late_initcall(fn) __define_initcall(fn, 7)
/* TODO: initcalls on startup for compiled-in modules */
#define define_initcall(fn) \
static initcall_t _initcall_##fn __attribute__((used)) \
__attribute__((__section__(".initcall"))) = fn;
void setup_arch(void); void setup_arch(void);
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <kernel/elf.h> #include <kernel/elf.h>
#ifdef MODULE
#define module_init(initfunc) \ #define module_init(initfunc) \
int _module_init(void) __attribute__((alias(#initfunc))); int _module_init(void) __attribute__((alias(#initfunc)));
...@@ -12,6 +13,15 @@ ...@@ -12,6 +13,15 @@
#define module_exit(exitfunc) \ #define module_exit(exitfunc) \
int _module_exit(void) __attribute__((alias(#exitfunc))); int _module_exit(void) __attribute__((alias(#exitfunc)));
#else /* MODULE */
#define module_init(initfunc) device_initcall(initfunc);
#define module_exit(exitfunc) __exitcall(exitfunc);
#endif /* MODULE */
struct module_section { struct module_section {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment