| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef _LINUX_INIT_H | 
|  | 2 | #define _LINUX_INIT_H | 
|  | 3 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 4 | #include <linux/compiler.h> | 
| Rusty Russell | 2329abf | 2012-01-13 09:32:18 +1030 | [diff] [blame] | 5 | #include <linux/types.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 6 |  | 
| David Woodhouse | fe43338 | 2018-02-01 11:27:20 +0000 | [diff] [blame] | 7 | /* Built-in __init functions needn't be compiled with retpoline */ | 
| David Woodhouse | 6123a6b | 2018-02-19 10:50:57 +0000 | [diff] [blame] | 8 | #if defined(__noretpoline) && !defined(MODULE) | 
|  | 9 | #define __noinitretpoline __noretpoline | 
| David Woodhouse | fe43338 | 2018-02-01 11:27:20 +0000 | [diff] [blame] | 10 | #else | 
| David Woodhouse | 6123a6b | 2018-02-19 10:50:57 +0000 | [diff] [blame] | 11 | #define __noinitretpoline | 
| David Woodhouse | fe43338 | 2018-02-01 11:27:20 +0000 | [diff] [blame] | 12 | #endif | 
|  | 13 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 14 | /* These macros are used to mark some functions or | 
|  | 15 | * initialized data (doesn't apply to uninitialized data) | 
|  | 16 | * as `initialization' functions. The kernel can take this | 
|  | 17 | * as hint that the function is used only during the initialization | 
|  | 18 | * phase and free up used memory resources after | 
|  | 19 | * | 
|  | 20 | * Usage: | 
|  | 21 | * For functions: | 
|  | 22 | * | 
|  | 23 | * You should add __init immediately before the function name, like: | 
|  | 24 | * | 
|  | 25 | * static void __init initme(int x, int y) | 
|  | 26 | * { | 
|  | 27 | *    extern int z; z = x * y; | 
|  | 28 | * } | 
|  | 29 | * | 
|  | 30 | * If the function has a prototype somewhere, you can also add | 
|  | 31 | * __init between closing brace of the prototype and semicolon: | 
|  | 32 | * | 
|  | 33 | * extern int initialize_foobar_device(int, int, int) __init; | 
|  | 34 | * | 
|  | 35 | * For initialized data: | 
| Geert Uytterhoeven | 6532154 | 2013-11-12 15:10:19 -0800 | [diff] [blame] | 36 | * You should insert __initdata or __initconst between the variable name | 
|  | 37 | * and equal sign followed by value, e.g.: | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 38 | * | 
|  | 39 | * static int init_variable __initdata = 0; | 
| Geert Uytterhoeven | ae52bb2 | 2009-06-16 15:34:19 -0700 | [diff] [blame] | 40 | * static const char linux_logo[] __initconst = { 0x32, 0x36, ... }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 41 | * | 
|  | 42 | * Don't forget to initialize data not at file scope, i.e. within a function, | 
|  | 43 | * as gcc otherwise puts the data into the bss section and not into the init | 
|  | 44 | * section. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 45 | */ | 
|  | 46 |  | 
|  | 47 | /* These are for everybody (although not all archs will actually | 
|  | 48 | discard it in modules) */ | 
| David Woodhouse | 6123a6b | 2018-02-19 10:50:57 +0000 | [diff] [blame] | 49 | #define __init		__section(.init.text) __cold notrace __latent_entropy __noinitretpoline | 
| Sam Ravnborg | f3fe866 | 2008-01-20 18:54:48 +0100 | [diff] [blame] | 50 | #define __initdata	__section(.init.data) | 
| Helge Deller | b5d5cf2 | 2016-09-20 17:20:10 +0200 | [diff] [blame] | 51 | #define __initconst	__section(.init.rodata) | 
| Sam Ravnborg | f3fe866 | 2008-01-20 18:54:48 +0100 | [diff] [blame] | 52 | #define __exitdata	__section(.exit.data) | 
| Adrian Bunk | 3ff6eec | 2008-01-24 22:16:20 +0100 | [diff] [blame] | 53 | #define __exit_call	__used __section(.exitcall.exit) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 54 |  | 
| Michal Nazarewicz | 5ea0817 | 2010-08-12 17:43:56 +0200 | [diff] [blame] | 55 | /* | 
|  | 56 | * modpost check for section mismatches during the kernel build. | 
| Sam Ravnborg | 0e0d314 | 2007-05-17 20:14:48 +0200 | [diff] [blame] | 57 | * A section mismatch happens when there are references from a | 
|  | 58 | * code or data section to an init section (both code or data). | 
|  | 59 | * The init sections are (for most archs) discarded by the kernel | 
|  | 60 | * when early init has completed so all such references are potential bugs. | 
|  | 61 | * For exit sections the same issue exists. | 
| Michal Nazarewicz | 5ea0817 | 2010-08-12 17:43:56 +0200 | [diff] [blame] | 62 | * | 
| Sam Ravnborg | 0e0d314 | 2007-05-17 20:14:48 +0200 | [diff] [blame] | 63 | * The following markers are used for the cases where the reference to | 
| Sam Ravnborg | 312b148 | 2008-01-28 20:21:15 +0100 | [diff] [blame] | 64 | * the *init / *exit section (code or data) is valid and will teach | 
| Michal Nazarewicz | 5ea0817 | 2010-08-12 17:43:56 +0200 | [diff] [blame] | 65 | * modpost not to issue a warning.  Intended semantics is that a code or | 
|  | 66 | * data tagged __ref* can reference code or data from init section without | 
|  | 67 | * producing a warning (of course, no warning does not mean code is | 
|  | 68 | * correct, so optimally document why the __ref is needed and why it's OK). | 
|  | 69 | * | 
|  | 70 | * The markers follow same syntax rules as __init / __initdata. | 
|  | 71 | */ | 
| Sam Ravnborg | 312b148 | 2008-01-28 20:21:15 +0100 | [diff] [blame] | 72 | #define __ref            __section(.ref.text) noinline | 
|  | 73 | #define __refdata        __section(.ref.data) | 
| Helge Deller | b5d5cf2 | 2016-09-20 17:20:10 +0200 | [diff] [blame] | 74 | #define __refconst       __section(.ref.rodata) | 
| Sam Ravnborg | 312b148 | 2008-01-28 20:21:15 +0100 | [diff] [blame] | 75 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 76 | #ifdef MODULE | 
| Sam Ravnborg | eb8f689 | 2008-01-20 20:07:28 +0100 | [diff] [blame] | 77 | #define __exitused | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 78 | #else | 
| Sam Ravnborg | eb8f689 | 2008-01-20 20:07:28 +0100 | [diff] [blame] | 79 | #define __exitused  __used | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 80 | #endif | 
|  | 81 |  | 
| Steven Rostedt | f020173 | 2011-04-12 19:06:39 -0400 | [diff] [blame] | 82 | #define __exit          __section(.exit.text) __exitused __cold notrace | 
| Sam Ravnborg | eb8f689 | 2008-01-20 20:07:28 +0100 | [diff] [blame] | 83 |  | 
| Sam Ravnborg | eb8f689 | 2008-01-20 20:07:28 +0100 | [diff] [blame] | 84 | /* Used for MEMORY_HOTPLUG */ | 
| Emese Revfy | 0766f78 | 2016-06-20 20:42:34 +0200 | [diff] [blame] | 85 | #define __meminit        __section(.meminit.text) __cold notrace \ | 
|  | 86 | __latent_entropy | 
| Sam Ravnborg | eb8f689 | 2008-01-20 20:07:28 +0100 | [diff] [blame] | 87 | #define __meminitdata    __section(.meminit.data) | 
| Helge Deller | b5d5cf2 | 2016-09-20 17:20:10 +0200 | [diff] [blame] | 88 | #define __meminitconst   __section(.meminit.rodata) | 
| Steven Rostedt | f020173 | 2011-04-12 19:06:39 -0400 | [diff] [blame] | 89 | #define __memexit        __section(.memexit.text) __exitused __cold notrace | 
| Sam Ravnborg | eb8f689 | 2008-01-20 20:07:28 +0100 | [diff] [blame] | 90 | #define __memexitdata    __section(.memexit.data) | 
| Helge Deller | b5d5cf2 | 2016-09-20 17:20:10 +0200 | [diff] [blame] | 91 | #define __memexitconst   __section(.memexit.rodata) | 
| Sam Ravnborg | eb8f689 | 2008-01-20 20:07:28 +0100 | [diff] [blame] | 92 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 93 | /* For assembly routines */ | 
| Sam Ravnborg | 7923f90 | 2009-06-14 22:10:41 +0200 | [diff] [blame] | 94 | #define __HEAD		.section	".head.text","ax" | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 95 | #define __INIT		.section	".init.text","ax" | 
| Prarit Bhargava | 86c0baf | 2007-05-02 19:27:05 +0200 | [diff] [blame] | 96 | #define __FINIT		.previous | 
| Sam Ravnborg | eb8f689 | 2008-01-20 20:07:28 +0100 | [diff] [blame] | 97 |  | 
| Jan Beulich | 8b5a10f | 2009-08-19 08:40:48 +0100 | [diff] [blame] | 98 | #define __INITDATA	.section	".init.data","aw",%progbits | 
|  | 99 | #define __INITRODATA	.section	".init.rodata","a",%progbits | 
| Ingo Molnar | 9f9975a | 2008-02-06 22:39:45 +0100 | [diff] [blame] | 100 | #define __FINITDATA	.previous | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 101 |  | 
| Sam Ravnborg | eb8f689 | 2008-01-20 20:07:28 +0100 | [diff] [blame] | 102 | #define __MEMINIT        .section	".meminit.text", "ax" | 
|  | 103 | #define __MEMINITDATA    .section	".meminit.data", "aw" | 
| Jan Beulich | 3f5e26c | 2008-10-25 15:02:51 -0700 | [diff] [blame] | 104 | #define __MEMINITRODATA  .section	".meminit.rodata", "a" | 
| Sam Ravnborg | eb8f689 | 2008-01-20 20:07:28 +0100 | [diff] [blame] | 105 |  | 
| Sam Ravnborg | 312b148 | 2008-01-28 20:21:15 +0100 | [diff] [blame] | 106 | /* silence warnings when references are OK */ | 
|  | 107 | #define __REF            .section       ".ref.text", "ax" | 
|  | 108 | #define __REFDATA        .section       ".ref.data", "aw" | 
| Jan Beulich | 3f5e26c | 2008-10-25 15:02:51 -0700 | [diff] [blame] | 109 | #define __REFCONST       .section       ".ref.rodata", "a" | 
| Sam Ravnborg | 312b148 | 2008-01-28 20:21:15 +0100 | [diff] [blame] | 110 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 111 | #ifndef __ASSEMBLY__ | 
|  | 112 | /* | 
|  | 113 | * Used for initialization calls.. | 
|  | 114 | */ | 
|  | 115 | typedef int (*initcall_t)(void); | 
|  | 116 | typedef void (*exitcall_t)(void); | 
|  | 117 |  | 
|  | 118 | extern initcall_t __con_initcall_start[], __con_initcall_end[]; | 
|  | 119 | extern initcall_t __security_initcall_start[], __security_initcall_end[]; | 
|  | 120 |  | 
| Peter Oberparleiter | b99b87f | 2009-06-17 16:28:03 -0700 | [diff] [blame] | 121 | /* Used for contructor calls. */ | 
|  | 122 | typedef void (*ctor_fn_t)(void); | 
|  | 123 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 124 | /* Defined in init/main.c */ | 
| Arjan van de Ven | 59f9415 | 2008-07-30 12:49:02 -0700 | [diff] [blame] | 125 | extern int do_one_initcall(initcall_t fn); | 
| Alon Bar-Lev | 30d7e0d | 2007-02-12 00:53:52 -0800 | [diff] [blame] | 126 | extern char __initdata boot_command_line[]; | 
|  | 127 | extern char *saved_command_line; | 
| Vivek Goyal | 7e96287 | 2006-09-27 01:50:44 -0700 | [diff] [blame] | 128 | extern unsigned int reset_devices; | 
| Adrian Bunk | 77d4758 | 2006-03-25 03:07:39 -0800 | [diff] [blame] | 129 |  | 
|  | 130 | /* used by init/main.c */ | 
| Adrian Bunk | 4659539 | 2007-05-08 00:24:47 -0700 | [diff] [blame] | 131 | void setup_arch(char **); | 
|  | 132 | void prepare_namespace(void); | 
| Tejun Heo | bb813f4 | 2013-01-18 14:05:56 -0800 | [diff] [blame] | 133 | void __init load_default_modules(void); | 
| Rob Landley | 57f150a | 2013-09-11 14:26:10 -0700 | [diff] [blame] | 134 | int __init init_rootfs(void); | 
| Adrian Bunk | 77d4758 | 2006-03-25 03:07:39 -0800 | [diff] [blame] | 135 |  | 
| AKASHI Takahiro | 7f9a93b | 2018-04-03 12:09:03 +0100 | [diff] [blame] | 136 | #if defined(CONFIG_DEBUG_RODATA) || defined(CONFIG_DEBUG_SET_MODULE_RONX) | 
|  | 137 | extern bool rodata_enabled; | 
|  | 138 | #endif | 
| Kees Cook | e267d97 | 2016-02-17 14:41:12 -0800 | [diff] [blame] | 139 | #ifdef CONFIG_DEBUG_RODATA | 
|  | 140 | void mark_rodata_ro(void); | 
|  | 141 | #endif | 
|  | 142 |  | 
| Adrian Bunk | 7d195a5 | 2008-04-29 00:59:18 -0700 | [diff] [blame] | 143 | extern void (*late_time_init)(void); | 
|  | 144 |  | 
| Rusty Russell | 2329abf | 2012-01-13 09:32:18 +1030 | [diff] [blame] | 145 | extern bool initcall_debug; | 
| Arjan van de Ven | f251177 | 2009-12-13 20:29:01 +0100 | [diff] [blame] | 146 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 147 | #endif | 
|  | 148 |  | 
|  | 149 | #ifndef MODULE | 
|  | 150 |  | 
|  | 151 | #ifndef __ASSEMBLY__ | 
|  | 152 |  | 
| Nicholas Piggin | b67067f | 2016-08-24 22:29:20 +1000 | [diff] [blame] | 153 | /* | 
|  | 154 | * initcalls are now grouped by functionality into separate | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 155 | * subsections. Ordering inside the subsections is determined | 
|  | 156 | * by link order. | 
|  | 157 | * For backwards compatibility, initcall() puts the call in | 
|  | 158 | * the device init subsection. | 
| Andrew Morton | 735a7ff | 2006-10-27 11:42:37 -0700 | [diff] [blame] | 159 | * | 
|  | 160 | * The `id' arg to __define_initcall() is needed so that multiple initcalls | 
|  | 161 | * can point at the same handler without causing duplicate-symbol build errors. | 
| Nicholas Piggin | b67067f | 2016-08-24 22:29:20 +1000 | [diff] [blame] | 162 | * | 
|  | 163 | * Initcalls are run by placing pointers in initcall sections that the | 
|  | 164 | * kernel iterates at runtime. The linker can do dead code / data elimination | 
|  | 165 | * and remove that completely, so the initcall sections have to be marked | 
|  | 166 | * as KEEP() in the linker script. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 167 | */ | 
|  | 168 |  | 
| Matthew Leach | 7929d40 | 2012-12-17 15:59:32 -0800 | [diff] [blame] | 169 | #define __define_initcall(fn, id) \ | 
| Adrian Bunk | 3ff6eec | 2008-01-24 22:16:20 +0100 | [diff] [blame] | 170 | static initcall_t __initcall_##fn##id __used \ | 
| Nicholas Piggin | b67067f | 2016-08-24 22:29:20 +1000 | [diff] [blame] | 171 | __attribute__((__section__(".initcall" #id ".init"))) = fn; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 172 |  | 
| Linus Torvalds | b3438f8 | 2006-11-20 11:47:18 -0800 | [diff] [blame] | 173 | /* | 
| Eduard - Gabriel Munteanu | c2147a5 | 2008-07-25 19:45:11 -0700 | [diff] [blame] | 174 | * Early initcalls run before initializing SMP. | 
|  | 175 | * | 
|  | 176 | * Only for built-in code, not modules. | 
|  | 177 | */ | 
| Matthew Leach | 7929d40 | 2012-12-17 15:59:32 -0800 | [diff] [blame] | 178 | #define early_initcall(fn)		__define_initcall(fn, early) | 
| Eduard - Gabriel Munteanu | c2147a5 | 2008-07-25 19:45:11 -0700 | [diff] [blame] | 179 |  | 
|  | 180 | /* | 
| Linus Torvalds | b3438f8 | 2006-11-20 11:47:18 -0800 | [diff] [blame] | 181 | * A "pure" initcall has no dependencies on anything else, and purely | 
|  | 182 | * initializes variables that couldn't be statically initialized. | 
|  | 183 | * | 
|  | 184 | * This only exists for built-in code, not for modules. | 
| Jim Cromie | 96263d2 | 2012-06-14 16:00:59 -0600 | [diff] [blame] | 185 | * Keep main.c:initcall_level_names[] in sync. | 
| Linus Torvalds | b3438f8 | 2006-11-20 11:47:18 -0800 | [diff] [blame] | 186 | */ | 
| Matthew Leach | 7929d40 | 2012-12-17 15:59:32 -0800 | [diff] [blame] | 187 | #define pure_initcall(fn)		__define_initcall(fn, 0) | 
| Linus Torvalds | b3438f8 | 2006-11-20 11:47:18 -0800 | [diff] [blame] | 188 |  | 
| Matthew Leach | 7929d40 | 2012-12-17 15:59:32 -0800 | [diff] [blame] | 189 | #define core_initcall(fn)		__define_initcall(fn, 1) | 
|  | 190 | #define core_initcall_sync(fn)		__define_initcall(fn, 1s) | 
|  | 191 | #define postcore_initcall(fn)		__define_initcall(fn, 2) | 
|  | 192 | #define postcore_initcall_sync(fn)	__define_initcall(fn, 2s) | 
|  | 193 | #define arch_initcall(fn)		__define_initcall(fn, 3) | 
|  | 194 | #define arch_initcall_sync(fn)		__define_initcall(fn, 3s) | 
|  | 195 | #define subsys_initcall(fn)		__define_initcall(fn, 4) | 
|  | 196 | #define subsys_initcall_sync(fn)	__define_initcall(fn, 4s) | 
|  | 197 | #define fs_initcall(fn)			__define_initcall(fn, 5) | 
|  | 198 | #define fs_initcall_sync(fn)		__define_initcall(fn, 5s) | 
|  | 199 | #define rootfs_initcall(fn)		__define_initcall(fn, rootfs) | 
|  | 200 | #define device_initcall(fn)		__define_initcall(fn, 6) | 
|  | 201 | #define device_initcall_sync(fn)	__define_initcall(fn, 6s) | 
|  | 202 | #define late_initcall(fn)		__define_initcall(fn, 7) | 
|  | 203 | #define late_initcall_sync(fn)		__define_initcall(fn, 7s) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 204 |  | 
|  | 205 | #define __initcall(fn) device_initcall(fn) | 
|  | 206 |  | 
| Nicholas Piggin | b67067f | 2016-08-24 22:29:20 +1000 | [diff] [blame] | 207 | #define __exitcall(fn)						\ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 208 | static exitcall_t __exitcall_##fn __exit_call = fn | 
|  | 209 |  | 
| Nicholas Piggin | b67067f | 2016-08-24 22:29:20 +1000 | [diff] [blame] | 210 | #define console_initcall(fn)					\ | 
|  | 211 | static initcall_t __initcall_##fn			\ | 
| Adrian Bunk | 3ff6eec | 2008-01-24 22:16:20 +0100 | [diff] [blame] | 212 | __used __section(.con_initcall.init) = fn | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 213 |  | 
| Nicholas Piggin | b67067f | 2016-08-24 22:29:20 +1000 | [diff] [blame] | 214 | #define security_initcall(fn)					\ | 
|  | 215 | static initcall_t __initcall_##fn			\ | 
| Adrian Bunk | 3ff6eec | 2008-01-24 22:16:20 +0100 | [diff] [blame] | 216 | __used __section(.security_initcall.init) = fn | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 217 |  | 
|  | 218 | struct obs_kernel_param { | 
|  | 219 | const char *str; | 
|  | 220 | int (*setup_func)(char *); | 
|  | 221 | int early; | 
|  | 222 | }; | 
|  | 223 |  | 
|  | 224 | /* | 
|  | 225 | * Only for really core code.  See moduleparam.h for the normal way. | 
|  | 226 | * | 
|  | 227 | * Force the alignment so the compiler doesn't space elements of the | 
|  | 228 | * obs_kernel_param "array" too far apart in .init.setup. | 
|  | 229 | */ | 
|  | 230 | #define __setup_param(str, unique_id, fn, early)			\ | 
| Ingo Molnar | c281b94 | 2015-03-05 08:28:48 +0100 | [diff] [blame] | 231 | static const char __setup_str_##unique_id[] __initconst		\ | 
|  | 232 | __aligned(1) = str; 					\ | 
|  | 233 | static struct obs_kernel_param __setup_##unique_id		\ | 
|  | 234 | __used __section(.init.setup)				\ | 
|  | 235 | __attribute__((aligned((sizeof(long)))))		\ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 236 | = { __setup_str_##unique_id, fn, early } | 
|  | 237 |  | 
| Ingo Molnar | c281b94 | 2015-03-05 08:28:48 +0100 | [diff] [blame] | 238 | #define __setup(str, fn)						\ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 239 | __setup_param(str, fn, fn, 0) | 
|  | 240 |  | 
| Ingo Molnar | c281b94 | 2015-03-05 08:28:48 +0100 | [diff] [blame] | 241 | /* | 
|  | 242 | * NOTE: fn is as per module_param, not __setup! | 
|  | 243 | * Emits warning if fn returns non-zero. | 
|  | 244 | */ | 
|  | 245 | #define early_param(str, fn)						\ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 246 | __setup_param(str, fn, fn, 1) | 
|  | 247 |  | 
| Ingo Molnar | c281b94 | 2015-03-05 08:28:48 +0100 | [diff] [blame] | 248 | #define early_param_on_off(str_on, str_off, var, config)		\ | 
|  | 249 | \ | 
|  | 250 | int var = IS_ENABLED(config);					\ | 
|  | 251 | \ | 
|  | 252 | static int __init parse_##var##_on(char *arg)			\ | 
|  | 253 | {								\ | 
|  | 254 | var = 1;						\ | 
|  | 255 | return 0;						\ | 
|  | 256 | }								\ | 
|  | 257 | __setup_param(str_on, parse_##var##_on, parse_##var##_on, 1);	\ | 
|  | 258 | \ | 
|  | 259 | static int __init parse_##var##_off(char *arg)			\ | 
|  | 260 | {								\ | 
|  | 261 | var = 0;						\ | 
|  | 262 | return 0;						\ | 
|  | 263 | }								\ | 
| Luis R. Rodriguez | bfb33ba | 2015-03-04 17:24:13 -0800 | [diff] [blame] | 264 | __setup_param(str_off, parse_##var##_off, parse_##var##_off, 1) | 
|  | 265 |  | 
| Alon Bar-Lev | 30d7e0d | 2007-02-12 00:53:52 -0800 | [diff] [blame] | 266 | /* Relies on boot_command_line being set */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 267 | void __init parse_early_param(void); | 
| Magnus Damm | 1397709 | 2009-03-30 14:37:25 -0700 | [diff] [blame] | 268 | void __init parse_early_options(char *cmdline); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 269 | #endif /* __ASSEMBLY__ */ | 
|  | 270 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 271 | #else /* MODULE */ | 
|  | 272 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 273 | #define __setup_param(str, unique_id, fn)	/* nothing */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 274 | #define __setup(str, func) 			/* nothing */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 275 | #endif | 
|  | 276 |  | 
| Johannes Berg | ab3bfca | 2007-05-06 14:50:49 -0700 | [diff] [blame] | 277 | /* Data marked not to be saved by software suspend */ | 
| Denys Vlasenko | 07b3bb1 | 2010-02-20 01:03:52 +0100 | [diff] [blame] | 278 | #define __nosavedata __section(.data..nosave) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 279 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 280 | #ifdef MODULE | 
|  | 281 | #define __exit_p(x) x | 
|  | 282 | #else | 
|  | 283 | #define __exit_p(x) NULL | 
|  | 284 | #endif | 
|  | 285 |  | 
|  | 286 | #endif /* _LINUX_INIT_H */ |