~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/include/linux/init.h

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #ifndef _LINUX_INIT_H
  2 #define _LINUX_INIT_H
  3 
  4 #include <linux/config.h>
  5 
  6 /* These macros are used to mark some functions or 
  7  * initialized data (doesn't apply to uninitialized data)
  8  * as `initialization' functions. The kernel can take this
  9  * as hint that the function is used only during the initialization
 10  * phase and free up used memory resources after
 11  *
 12  * Usage:
 13  * For functions:
 14  * 
 15  * You should add __init immediately before the function name, like:
 16  *
 17  * static void __init initme(int x, int y)
 18  * {
 19  *    extern int z; z = x * y;
 20  * }
 21  *
 22  * If the function has a prototype somewhere, you can also add
 23  * __init between closing brace of the prototype and semicolon:
 24  *
 25  * extern int initialize_foobar_device(int, int, int) __init;
 26  *
 27  * For initialized data:
 28  * You should insert __initdata between the variable name and equal
 29  * sign followed by value, e.g.:
 30  *
 31  * static int init_variable __initdata = 0;
 32  * static char linux_logo[] __initdata = { 0x32, 0x36, ... };
 33  *
 34  * Don't forget to initialize data not at file scope, i.e. within a function,
 35  * as gcc otherwise puts the data into the bss section and not into the init
 36  * section.
 37  */
 38 
 39 #ifndef MODULE
 40 
 41 #ifndef __ASSEMBLY__
 42 
 43 /*
 44  * Used for initialization calls..
 45  */
 46 typedef int (*initcall_t)(void);
 47 typedef void (*exitcall_t)(void);
 48 
 49 extern initcall_t __initcall_start, __initcall_end;
 50 
 51 #define __initcall(fn)                                                          \
 52         static initcall_t __initcall_##fn __init_call = fn
 53 #define __exitcall(fn)                                                          \
 54         static exitcall_t __exitcall_##fn __exit_call = fn
 55 
 56 /*
 57  * Used for kernel command line parameter setup
 58  */
 59 struct kernel_param {
 60         const char *str;
 61         int (*setup_func)(char *);
 62 };
 63 
 64 extern struct kernel_param __setup_start, __setup_end;
 65 
 66 #define __setup(str, fn)                                                                \
 67         static char __setup_str_##fn[] __initdata = str;                                \
 68         static struct kernel_param __setup_##fn __attribute__((unused)) __initsetup = { __setup_str_##fn, fn }
 69 
 70 #endif /* __ASSEMBLY__ */
 71 
 72 /*
 73  * Mark functions and data as being only used at initialization
 74  * or exit time.
 75  */
 76 #define __init          __attribute__ ((__section__ (".text.init")))
 77 #define __exit          __attribute__ ((unused, __section__(".text.exit")))
 78 #define __initdata      __attribute__ ((__section__ (".data.init")))
 79 #define __exitdata      __attribute__ ((unused, __section__ (".data.exit")))
 80 #define __initsetup     __attribute__ ((unused,__section__ (".setup.init")))
 81 #define __init_call     __attribute__ ((unused,__section__ (".initcall.init")))
 82 #define __exit_call     __attribute__ ((unused,__section__ (".exitcall.exit")))
 83 
 84 /* For assembly routines */
 85 #define __INIT          .section        ".text.init","ax"
 86 #define __FINIT         .previous
 87 #define __INITDATA      .section        ".data.init","aw"
 88 
 89 #define module_init(x)  __initcall(x);
 90 #define module_exit(x)  __exitcall(x);
 91 
 92 #else
 93 
 94 #define __init
 95 #define __exit
 96 #define __initdata
 97 #define __exitdata
 98 #define __initcall(fn)
 99 /* For assembly routines */
100 #define __INIT
101 #define __FINIT
102 #define __INITDATA
103 
104 /* These macros create a dummy inline: gcc 2.9x does not count alias
105  as usage, hence the `unused function' warning when __init functions
106  are declared static. We use the dummy __*_module_inline functions
107  both to kill the warning and check the type of the init/cleanup
108  function. */
109 typedef int (*__init_module_func_t)(void);
110 typedef void (*__cleanup_module_func_t)(void);
111 #define module_init(x) \
112         int init_module(void) __attribute__((alias(#x))); \
113         extern inline __init_module_func_t __init_module_inline(void) \
114         { return x; }
115 #define module_exit(x) \
116         void cleanup_module(void) __attribute__((alias(#x))); \
117         extern inline __cleanup_module_func_t __cleanup_module_inline(void) \
118         { return x; }
119 
120 #define __setup(str,func) /* nothing */
121 
122 #endif
123 
124 #ifdef CONFIG_HOTPLUG
125 #define __devinit
126 #define __devinitdata
127 #define __devexit
128 #define __devexitdata
129 #else
130 #define __devinit __init
131 #define __devinitdata __initdata
132 #define __devexit __exit
133 #define __devexitdata __exitdata
134 #endif
135 
136 #endif /* _LINUX_INIT_H */
137 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.