summaryrefslogtreecommitdiffstats
path: root/include/linux/init.h
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-07-08 00:53:00 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-07-08 00:53:00 +0000
commitb8553086288629b4efb77e97f5582e08bc50ad65 (patch)
tree0a19bd1c21e148f35c7a0f76baa4f7a056b966b0 /include/linux/init.h
parent75b6d92f2dd5112b02f4e78cf9f35f9825946ef0 (diff)
Merge with 2.4.0-test3-pre4.
Diffstat (limited to 'include/linux/init.h')
-rw-r--r--include/linux/init.h23
1 files changed, 20 insertions, 3 deletions
diff --git a/include/linux/init.h b/include/linux/init.h
index 20fc892e9..6300d86da 100644
--- a/include/linux/init.h
+++ b/include/linux/init.h
@@ -43,11 +43,14 @@
* Used for initialization calls..
*/
typedef int (*initcall_t)(void);
+typedef void (*exitcall_t)(void);
extern initcall_t __initcall_start, __initcall_end;
#define __initcall(fn) \
static initcall_t __initcall_##fn __init_call = fn
+#define __exitcall(fn) \
+ static exitcall_t __exitcall_##fn __exit_call = fn
/*
* Used for kernel command line parameter setup
@@ -75,6 +78,7 @@ extern struct kernel_param __setup_start, __setup_end;
#define __exitdata __attribute__ ((unused, __section__ (".data.exit")))
#define __initsetup __attribute__ ((unused,__section__ (".setup.init")))
#define __init_call __attribute__ ((unused,__section__ (".initcall.init")))
+#define __exit_call __attribute__ ((unused,__section__ (".exitcall.exit")))
/* For assembly routines */
#define __INIT .section ".text.init","ax"
@@ -82,7 +86,7 @@ extern struct kernel_param __setup_start, __setup_end;
#define __INITDATA .section ".data.init","aw"
#define module_init(x) __initcall(x);
-#define module_exit(x) /* nothing */
+#define module_exit(x) __exitcall(x);
#else
@@ -98,8 +102,21 @@ extern struct kernel_param __setup_start, __setup_end;
/* Not sure what version aliases were introduced in, but certainly in 2.91.66. */
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 91)
-#define module_init(x) int init_module(void) __attribute__((alias(#x)));
-#define module_exit(x) void cleanup_module(void) __attribute__((alias(#x)));
+/* These macros create a dummy inline: gcc 2.9x does not count alias
+ as usage, hence the `unused function' warning when __init functions
+ are declared static. We use the dummy __*_module_inline functions
+ both to kill the warning and check the type of the init/cleanup
+ function. */
+typedef int (*__init_module_func_t)(void);
+typedef void (*__cleanup_module_func_t)(void);
+#define module_init(x) \
+ int init_module(void) __attribute__((alias(#x))); \
+ extern inline __init_module_func_t __init_module_inline(void) \
+ { return x; }
+#define module_exit(x) \
+ void cleanup_module(void) __attribute__((alias(#x))); \
+ extern inline __cleanup_module_func_t __cleanup_module_inline(void) \
+ { return x; }
#else
#define module_init(x) int init_module(void) { return x(); }
#define module_exit(x) void cleanup_module(void) { x(); }