PageRenderTime 21ms CodeModel.GetById 12ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 0ms

/arch/um/include/init.h

https://bitbucket.org/evzijst/gittest
C Header | 132 lines | 60 code | 22 blank | 50 comment | 0 complexity | 71962e14b9e5f1831ac5fa36f2de9640 MD5 | raw file
  1#ifndef _LINUX_UML_INIT_H
  2#define _LINUX_UML_INIT_H
  3
  4/* These macros are used to mark some functions or
  5 * initialized data (doesn't apply to uninitialized data)
  6 * as `initialization' functions. The kernel can take this
  7 * as hint that the function is used only during the initialization
  8 * phase and free up used memory resources after
  9 *
 10 * Usage:
 11 * For functions:
 12 *
 13 * You should add __init immediately before the function name, like:
 14 *
 15 * static void __init initme(int x, int y)
 16 * {
 17 *    extern int z; z = x * y;
 18 * }
 19 *
 20 * If the function has a prototype somewhere, you can also add
 21 * __init between closing brace of the prototype and semicolon:
 22 *
 23 * extern int initialize_foobar_device(int, int, int) __init;
 24 *
 25 * For initialized data:
 26 * You should insert __initdata between the variable name and equal
 27 * sign followed by value, e.g.:
 28 *
 29 * static int init_variable __initdata = 0;
 30 * static char linux_logo[] __initdata = { 0x32, 0x36, ... };
 31 *
 32 * Don't forget to initialize data not at file scope, i.e. within a function,
 33 * as gcc otherwise puts the data into the bss section and not into the init
 34 * section.
 35 *
 36 * Also note, that this data cannot be "const".
 37 */
 38
 39#ifndef _LINUX_INIT_H
 40typedef int (*initcall_t)(void);
 41typedef void (*exitcall_t)(void);
 42
 43/* These are for everybody (although not all archs will actually
 44   discard it in modules) */
 45#define __init		__attribute__ ((__section__ (".init.text")))
 46#define __initdata	__attribute__ ((__section__ (".init.data")))
 47#define __exitdata	__attribute__ ((__section__(".exit.data")))
 48#define __exit_call	__attribute_used__ __attribute__ ((__section__ (".exitcall.exit")))
 49
 50#ifdef MODULE
 51#define __exit		__attribute__ ((__section__(".exit.text")))
 52#else
 53#define __exit		__attribute_used__ __attribute__ ((__section__(".exit.text")))
 54#endif
 55
 56#endif
 57
 58#ifndef MODULE
 59struct uml_param {
 60        const char *str;
 61        int (*setup_func)(char *, int *);
 62};
 63
 64extern initcall_t __uml_initcall_start, __uml_initcall_end;
 65extern initcall_t __uml_postsetup_start, __uml_postsetup_end;
 66extern const char *__uml_help_start, *__uml_help_end;
 67#endif
 68
 69#define __uml_initcall(fn)					  	\
 70	static initcall_t __uml_initcall_##fn __uml_init_call = fn
 71
 72#define __uml_exitcall(fn)						\
 73	static exitcall_t __uml_exitcall_##fn __uml_exit_call = fn
 74
 75extern struct uml_param __uml_setup_start, __uml_setup_end;
 76
 77#define __uml_postsetup(fn)						\
 78	static initcall_t __uml_postsetup_##fn __uml_postsetup_call = fn
 79
 80#define __non_empty_string(dummyname,string)				\
 81	struct __uml_non_empty_string_struct_##dummyname		\
 82	{								\
 83		char _string[sizeof(string)-2];				\
 84	}
 85
 86#ifndef MODULE
 87#define __uml_setup(str, fn, help...)					\
 88	__non_empty_string(fn ##_setup, str);				\
 89	__uml_help(fn, help);						\
 90	static char __uml_setup_str_##fn[] __initdata = str;		\
 91	static struct uml_param __uml_setup_##fn __uml_init_setup = { __uml_setup_str_##fn, fn }
 92#else
 93#define __uml_setup(str, fn, help...)					\
 94
 95#endif
 96
 97#define __uml_help(fn, help...)						\
 98	__non_empty_string(fn ##__help, help);				\
 99	static char __uml_help_str_##fn[] __initdata = help;		\
100	static const char *__uml_help_##fn __uml_setup_help = __uml_help_str_##fn
101
102/*
103 * Mark functions and data as being only used at initialization
104 * or exit time.
105 */
106#define __uml_init_setup	__attribute_used__ __attribute__ ((__section__ (".uml.setup.init")))
107#define __uml_setup_help	__attribute_used__ __attribute__ ((__section__ (".uml.help.init")))
108#define __uml_init_call		__attribute_used__ __attribute__ ((__section__ (".uml.initcall.init")))
109#define __uml_postsetup_call	__attribute_used__ __attribute__ ((__section__ (".uml.postsetup.init")))
110#define __uml_exit_call		__attribute_used__ __attribute__ ((__section__ (".uml.exitcall.exit")))
111
112#ifndef __KERNEL__
113
114#define __initcall(fn) static initcall_t __initcall_##fn __init_call = fn
115#define __exitcall(fn) static exitcall_t __exitcall_##fn __exit_call = fn
116
117#define __init_call __attribute__ ((unused,__section__ (".initcall.init")))
118
119#endif
120
121#endif /* _LINUX_UML_INIT_H */
122
123/*
124 * Overrides for Emacs so that we follow Linus's tabbing style.
125 * Emacs will notice this stuff at the end of the file and automatically
126 * adjust the settings for this buffer only.  This must remain at the end
127 * of the file.
128 * ---------------------------------------------------------------------------
129 * Local variables:
130 * c-file-style: "linux"
131 * End:
132 */