1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _LINUX_INIT_H
31da177e4SLinus Torvalds #define _LINUX_INIT_H
41da177e4SLinus Torvalds
5de985c10SMasahiro Yamada #include <linux/build_bug.h>
61da177e4SLinus Torvalds #include <linux/compiler.h>
7de985c10SMasahiro Yamada #include <linux/stringify.h>
82329abfaSRusty Russell #include <linux/types.h>
91da177e4SLinus Torvalds
1066f79309SDavid Woodhouse /* Built-in __init functions needn't be compiled with retpoline */
1187358710SDavid Woodhouse #if defined(__noretpoline) && !defined(MODULE)
1287358710SDavid Woodhouse #define __noinitretpoline __noretpoline
1366f79309SDavid Woodhouse #else
1487358710SDavid Woodhouse #define __noinitretpoline
1566f79309SDavid Woodhouse #endif
1666f79309SDavid Woodhouse
171da177e4SLinus Torvalds /* These macros are used to mark some functions or
181da177e4SLinus Torvalds * initialized data (doesn't apply to uninitialized data)
191da177e4SLinus Torvalds * as `initialization' functions. The kernel can take this
201da177e4SLinus Torvalds * as hint that the function is used only during the initialization
211da177e4SLinus Torvalds * phase and free up used memory resources after
221da177e4SLinus Torvalds *
231da177e4SLinus Torvalds * Usage:
241da177e4SLinus Torvalds * For functions:
251da177e4SLinus Torvalds *
261da177e4SLinus Torvalds * You should add __init immediately before the function name, like:
271da177e4SLinus Torvalds *
281da177e4SLinus Torvalds * static void __init initme(int x, int y)
291da177e4SLinus Torvalds * {
301da177e4SLinus Torvalds * extern int z; z = x * y;
311da177e4SLinus Torvalds * }
321da177e4SLinus Torvalds *
331da177e4SLinus Torvalds * If the function has a prototype somewhere, you can also add
341da177e4SLinus Torvalds * __init between closing brace of the prototype and semicolon:
351da177e4SLinus Torvalds *
361da177e4SLinus Torvalds * extern int initialize_foobar_device(int, int, int) __init;
371da177e4SLinus Torvalds *
381da177e4SLinus Torvalds * For initialized data:
3965321547SGeert Uytterhoeven * You should insert __initdata or __initconst between the variable name
4065321547SGeert Uytterhoeven * and equal sign followed by value, e.g.:
411da177e4SLinus Torvalds *
421da177e4SLinus Torvalds * static int init_variable __initdata = 0;
43ae52bb23SGeert Uytterhoeven * static const char linux_logo[] __initconst = { 0x32, 0x36, ... };
441da177e4SLinus Torvalds *
451da177e4SLinus Torvalds * Don't forget to initialize data not at file scope, i.e. within a function,
461da177e4SLinus Torvalds * as gcc otherwise puts the data into the bss section and not into the init
471da177e4SLinus Torvalds * section.
481da177e4SLinus Torvalds */
491da177e4SLinus Torvalds
501da177e4SLinus Torvalds /* These are for everybody (although not all archs will actually
511da177e4SLinus Torvalds discard it in modules) */
525dbbb3eaSSami Tolvanen #define __init __section(".init.text") __cold __latent_entropy __noinitretpoline
5333def849SJoe Perches #define __initdata __section(".init.data")
5433def849SJoe Perches #define __initconst __section(".init.rodata")
5533def849SJoe Perches #define __exitdata __section(".exit.data")
5633def849SJoe Perches #define __exit_call __used __section(".exitcall.exit")
571da177e4SLinus Torvalds
585ea08178SMichal Nazarewicz /*
595ea08178SMichal Nazarewicz * modpost check for section mismatches during the kernel build.
600e0d314eSSam Ravnborg * A section mismatch happens when there are references from a
610e0d314eSSam Ravnborg * code or data section to an init section (both code or data).
620e0d314eSSam Ravnborg * The init sections are (for most archs) discarded by the kernel
630e0d314eSSam Ravnborg * when early init has completed so all such references are potential bugs.
640e0d314eSSam Ravnborg * For exit sections the same issue exists.
655ea08178SMichal Nazarewicz *
660e0d314eSSam Ravnborg * The following markers are used for the cases where the reference to
67312b1485SSam Ravnborg * the *init / *exit section (code or data) is valid and will teach
685ea08178SMichal Nazarewicz * modpost not to issue a warning. Intended semantics is that a code or
695ea08178SMichal Nazarewicz * data tagged __ref* can reference code or data from init section without
705ea08178SMichal Nazarewicz * producing a warning (of course, no warning does not mean code is
715ea08178SMichal Nazarewicz * correct, so optimally document why the __ref is needed and why it's OK).
725ea08178SMichal Nazarewicz *
735ea08178SMichal Nazarewicz * The markers follow same syntax rules as __init / __initdata.
745ea08178SMichal Nazarewicz */
7533def849SJoe Perches #define __ref __section(".ref.text") noinline
7633def849SJoe Perches #define __refdata __section(".ref.data")
7733def849SJoe Perches #define __refconst __section(".ref.rodata")
78312b1485SSam Ravnborg
791da177e4SLinus Torvalds #ifdef MODULE
80eb8f6890SSam Ravnborg #define __exitused
811da177e4SLinus Torvalds #else
82eb8f6890SSam Ravnborg #define __exitused __used
831da177e4SLinus Torvalds #endif
841da177e4SLinus Torvalds
8533def849SJoe Perches #define __exit __section(".exit.text") __exitused __cold notrace
86eb8f6890SSam Ravnborg
87*73db3abdSMasahiro Yamada #ifdef CONFIG_MEMORY_HOTPLUG
88*73db3abdSMasahiro Yamada #define __meminit
89*73db3abdSMasahiro Yamada #define __meminitdata
90*73db3abdSMasahiro Yamada #define __meminitconst
91*73db3abdSMasahiro Yamada #else
92*73db3abdSMasahiro Yamada #define __meminit __init
93*73db3abdSMasahiro Yamada #define __meminitdata __initdata
94*73db3abdSMasahiro Yamada #define __meminitconst __initconst
95*73db3abdSMasahiro Yamada #endif
96eb8f6890SSam Ravnborg
971da177e4SLinus Torvalds /* For assembly routines */
987923f90fSSam Ravnborg #define __HEAD .section ".head.text","ax"
991da177e4SLinus Torvalds #define __INIT .section ".init.text","ax"
10086c0baf1SPrarit Bhargava #define __FINIT .previous
101eb8f6890SSam Ravnborg
1028b5a10fcSJan Beulich #define __INITDATA .section ".init.data","aw",%progbits
1038b5a10fcSJan Beulich #define __INITRODATA .section ".init.rodata","a",%progbits
1049f9975a5SIngo Molnar #define __FINITDATA .previous
1051da177e4SLinus Torvalds
106312b1485SSam Ravnborg /* silence warnings when references are OK */
107312b1485SSam Ravnborg #define __REF .section ".ref.text", "ax"
108312b1485SSam Ravnborg #define __REFDATA .section ".ref.data", "aw"
1093f5e26ceSJan Beulich #define __REFCONST .section ".ref.rodata", "a"
110312b1485SSam Ravnborg
1111da177e4SLinus Torvalds #ifndef __ASSEMBLY__
1121da177e4SLinus Torvalds /*
1131da177e4SLinus Torvalds * Used for initialization calls..
1141da177e4SLinus Torvalds */
1151da177e4SLinus Torvalds typedef int (*initcall_t)(void);
1161da177e4SLinus Torvalds typedef void (*exitcall_t)(void);
1171da177e4SLinus Torvalds
1181b1eeca7SArd Biesheuvel #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
1191b1eeca7SArd Biesheuvel typedef int initcall_entry_t;
1201b1eeca7SArd Biesheuvel
initcall_from_entry(initcall_entry_t * entry)1211b1eeca7SArd Biesheuvel static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
1221b1eeca7SArd Biesheuvel {
1231b1eeca7SArd Biesheuvel return offset_to_ptr(entry);
1241b1eeca7SArd Biesheuvel }
1251b1eeca7SArd Biesheuvel #else
1261b1eeca7SArd Biesheuvel typedef initcall_t initcall_entry_t;
1271b1eeca7SArd Biesheuvel
initcall_from_entry(initcall_entry_t * entry)1281b1eeca7SArd Biesheuvel static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
1291b1eeca7SArd Biesheuvel {
1301b1eeca7SArd Biesheuvel return *entry;
1311b1eeca7SArd Biesheuvel }
1321b1eeca7SArd Biesheuvel #endif
1331b1eeca7SArd Biesheuvel
1341b1eeca7SArd Biesheuvel extern initcall_entry_t __con_initcall_start[], __con_initcall_end[];
1351da177e4SLinus Torvalds
1368f824b4aSJiangshan Yi /* Used for constructor calls. */
137b99b87f7SPeter Oberparleiter typedef void (*ctor_fn_t)(void);
138b99b87f7SPeter Oberparleiter
139fd3e007fSAl Viro struct file_system_type;
140fd3e007fSAl Viro
1411da177e4SLinus Torvalds /* Defined in init/main.c */
14259f9415fSArjan van de Ven extern int do_one_initcall(initcall_t fn);
14330d7e0d4SAlon Bar-Lev extern char __initdata boot_command_line[];
14430d7e0d4SAlon Bar-Lev extern char *saved_command_line;
145941baf6fSAlexey Dobriyan extern unsigned int saved_command_line_len;
1467e96287dSVivek Goyal extern unsigned int reset_devices;
14777d47582SAdrian Bunk
14877d47582SAdrian Bunk /* used by init/main.c */
14946595390SAdrian Bunk void setup_arch(char **);
15046595390SAdrian Bunk void prepare_namespace(void);
151037f11b4SAl Viro void __init init_rootfs(void);
152ad1a4830SArnd Bergmann
153ad1a4830SArnd Bergmann void init_IRQ(void);
154ad1a4830SArnd Bergmann void time_init(void);
155ad1a4830SArnd Bergmann void poking_init(void);
156ad1a4830SArnd Bergmann void pgtable_cache_init(void);
157ad1a4830SArnd Bergmann
158ad1a4830SArnd Bergmann extern initcall_entry_t __initcall_start[];
159ad1a4830SArnd Bergmann extern initcall_entry_t __initcall0_start[];
160ad1a4830SArnd Bergmann extern initcall_entry_t __initcall1_start[];
161ad1a4830SArnd Bergmann extern initcall_entry_t __initcall2_start[];
162ad1a4830SArnd Bergmann extern initcall_entry_t __initcall3_start[];
163ad1a4830SArnd Bergmann extern initcall_entry_t __initcall4_start[];
164ad1a4830SArnd Bergmann extern initcall_entry_t __initcall5_start[];
165ad1a4830SArnd Bergmann extern initcall_entry_t __initcall6_start[];
166ad1a4830SArnd Bergmann extern initcall_entry_t __initcall7_start[];
167ad1a4830SArnd Bergmann extern initcall_entry_t __initcall_end[];
168ad1a4830SArnd Bergmann
169fd3e007fSAl Viro extern struct file_system_type rootfs_fs_type;
17077d47582SAdrian Bunk
17139290b38SAKASHI Takahiro extern bool rodata_enabled;
172e267d97bSKees Cook void mark_rodata_ro(void);
173e267d97bSKees Cook
1747d195a54SAdrian Bunk extern void (*late_time_init)(void);
1757d195a54SAdrian Bunk
1762329abfaSRusty Russell extern bool initcall_debug;
177f2511774SArjan van de Ven
1785b20755bSMasahiro Yamada #ifdef MODULE
1795b20755bSMasahiro Yamada extern struct module __this_module;
1805b20755bSMasahiro Yamada #define THIS_MODULE (&__this_module)
1815b20755bSMasahiro Yamada #else
1825b20755bSMasahiro Yamada #define THIS_MODULE ((struct module *)0)
1835b20755bSMasahiro Yamada #endif
1845b20755bSMasahiro Yamada
1851da177e4SLinus Torvalds #endif
1861da177e4SLinus Torvalds
1871da177e4SLinus Torvalds #ifndef MODULE
1881da177e4SLinus Torvalds
1891da177e4SLinus Torvalds #ifndef __ASSEMBLY__
1901da177e4SLinus Torvalds
191b67067f1SNicholas Piggin /*
192b67067f1SNicholas Piggin * initcalls are now grouped by functionality into separate
1931da177e4SLinus Torvalds * subsections. Ordering inside the subsections is determined
1941da177e4SLinus Torvalds * by link order.
1951da177e4SLinus Torvalds * For backwards compatibility, initcall() puts the call in
1961da177e4SLinus Torvalds * the device init subsection.
197735a7ffbSAndrew Morton *
198735a7ffbSAndrew Morton * The `id' arg to __define_initcall() is needed so that multiple initcalls
199735a7ffbSAndrew Morton * can point at the same handler without causing duplicate-symbol build errors.
200b67067f1SNicholas Piggin *
201b67067f1SNicholas Piggin * Initcalls are run by placing pointers in initcall sections that the
202b67067f1SNicholas Piggin * kernel iterates at runtime. The linker can do dead code / data elimination
203b67067f1SNicholas Piggin * and remove that completely, so the initcall sections have to be marked
204b67067f1SNicholas Piggin * as KEEP() in the linker script.
2051da177e4SLinus Torvalds */
2061da177e4SLinus Torvalds
207a8cccdd9SSami Tolvanen /* Format: <modname>__<counter>_<line>_<fn> */
208a8cccdd9SSami Tolvanen #define __initcall_id(fn) \
209a8cccdd9SSami Tolvanen __PASTE(__KBUILD_MODNAME, \
210a8cccdd9SSami Tolvanen __PASTE(__, \
211a8cccdd9SSami Tolvanen __PASTE(__COUNTER__, \
212a8cccdd9SSami Tolvanen __PASTE(_, \
213a8cccdd9SSami Tolvanen __PASTE(__LINE__, \
214a8cccdd9SSami Tolvanen __PASTE(_, fn))))))
215a8cccdd9SSami Tolvanen
216a8cccdd9SSami Tolvanen /* Format: __<prefix>__<iid><id> */
217a8cccdd9SSami Tolvanen #define __initcall_name(prefix, __iid, id) \
218a8cccdd9SSami Tolvanen __PASTE(__, \
219a8cccdd9SSami Tolvanen __PASTE(prefix, \
220a8cccdd9SSami Tolvanen __PASTE(__, \
221a8cccdd9SSami Tolvanen __PASTE(__iid, id))))
222a8cccdd9SSami Tolvanen
223a8cccdd9SSami Tolvanen #ifdef CONFIG_LTO_CLANG
224a8cccdd9SSami Tolvanen /*
225a8cccdd9SSami Tolvanen * With LTO, the compiler doesn't necessarily obey link order for
226a8cccdd9SSami Tolvanen * initcalls. In order to preserve the correct order, we add each
227a8cccdd9SSami Tolvanen * variable into its own section and generate a linker script (in
228a8cccdd9SSami Tolvanen * scripts/link-vmlinux.sh) to specify the order of the sections.
229a8cccdd9SSami Tolvanen */
230a8cccdd9SSami Tolvanen #define __initcall_section(__sec, __iid) \
231a8cccdd9SSami Tolvanen #__sec ".init.." #__iid
2323578ad11SSami Tolvanen
2333578ad11SSami Tolvanen /*
2343578ad11SSami Tolvanen * With LTO, the compiler can rename static functions to avoid
2353578ad11SSami Tolvanen * global naming collisions. We use a global stub function for
2363578ad11SSami Tolvanen * initcalls to create a stable symbol name whose address can be
2373578ad11SSami Tolvanen * taken in inline assembly when PREL32 relocations are used.
2383578ad11SSami Tolvanen */
2393578ad11SSami Tolvanen #define __initcall_stub(fn, __iid, id) \
2403578ad11SSami Tolvanen __initcall_name(initstub, __iid, id)
2413578ad11SSami Tolvanen
2423578ad11SSami Tolvanen #define __define_initcall_stub(__stub, fn) \
2435659b598SSami Tolvanen int __init __stub(void); \
2445659b598SSami Tolvanen int __init __stub(void) \
2453578ad11SSami Tolvanen { \
2463578ad11SSami Tolvanen return fn(); \
2473578ad11SSami Tolvanen } \
2483578ad11SSami Tolvanen __ADDRESSABLE(__stub)
249a8cccdd9SSami Tolvanen #else
250a8cccdd9SSami Tolvanen #define __initcall_section(__sec, __iid) \
251a8cccdd9SSami Tolvanen #__sec ".init"
2523578ad11SSami Tolvanen
2533578ad11SSami Tolvanen #define __initcall_stub(fn, __iid, id) fn
2543578ad11SSami Tolvanen
2553578ad11SSami Tolvanen #define __define_initcall_stub(__stub, fn) \
2563578ad11SSami Tolvanen __ADDRESSABLE(fn)
257a8cccdd9SSami Tolvanen #endif
258a8cccdd9SSami Tolvanen
2591b1eeca7SArd Biesheuvel #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
2603578ad11SSami Tolvanen #define ____define_initcall(fn, __stub, __name, __sec) \
2613578ad11SSami Tolvanen __define_initcall_stub(__stub, fn) \
262a8cccdd9SSami Tolvanen asm(".section \"" __sec "\", \"a\" \n" \
263a8cccdd9SSami Tolvanen __stringify(__name) ": \n" \
2643578ad11SSami Tolvanen ".long " __stringify(__stub) " - . \n" \
2651cb61759SMarco Elver ".previous \n"); \
2661cb61759SMarco Elver static_assert(__same_type(initcall_t, &fn));
2671b1eeca7SArd Biesheuvel #else
2683578ad11SSami Tolvanen #define ____define_initcall(fn, __unused, __name, __sec) \
269a8cccdd9SSami Tolvanen static initcall_t __name __used \
270a8cccdd9SSami Tolvanen __attribute__((__section__(__sec))) = fn;
2711b1eeca7SArd Biesheuvel #endif
2721b1eeca7SArd Biesheuvel
273a8cccdd9SSami Tolvanen #define __unique_initcall(fn, id, __sec, __iid) \
274a8cccdd9SSami Tolvanen ____define_initcall(fn, \
2753578ad11SSami Tolvanen __initcall_stub(fn, __iid, id), \
276a8cccdd9SSami Tolvanen __initcall_name(initcall, __iid, id), \
277a8cccdd9SSami Tolvanen __initcall_section(__sec, __iid))
278a8cccdd9SSami Tolvanen
279a8cccdd9SSami Tolvanen #define ___define_initcall(fn, id, __sec) \
280a8cccdd9SSami Tolvanen __unique_initcall(fn, id, __sec, __initcall_id(fn))
281a8cccdd9SSami Tolvanen
2821b1eeca7SArd Biesheuvel #define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
2831da177e4SLinus Torvalds
284b3438f82SLinus Torvalds /*
285c2147a50SEduard - Gabriel Munteanu * Early initcalls run before initializing SMP.
286c2147a50SEduard - Gabriel Munteanu *
287c2147a50SEduard - Gabriel Munteanu * Only for built-in code, not modules.
288c2147a50SEduard - Gabriel Munteanu */
2897929d407SMatthew Leach #define early_initcall(fn) __define_initcall(fn, early)
290c2147a50SEduard - Gabriel Munteanu
291c2147a50SEduard - Gabriel Munteanu /*
292b3438f82SLinus Torvalds * A "pure" initcall has no dependencies on anything else, and purely
293b3438f82SLinus Torvalds * initializes variables that couldn't be statically initialized.
294b3438f82SLinus Torvalds *
295b3438f82SLinus Torvalds * This only exists for built-in code, not for modules.
29696263d28SJim Cromie * Keep main.c:initcall_level_names[] in sync.
297b3438f82SLinus Torvalds */
2987929d407SMatthew Leach #define pure_initcall(fn) __define_initcall(fn, 0)
299b3438f82SLinus Torvalds
3007929d407SMatthew Leach #define core_initcall(fn) __define_initcall(fn, 1)
3017929d407SMatthew Leach #define core_initcall_sync(fn) __define_initcall(fn, 1s)
3027929d407SMatthew Leach #define postcore_initcall(fn) __define_initcall(fn, 2)
3037929d407SMatthew Leach #define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
3047929d407SMatthew Leach #define arch_initcall(fn) __define_initcall(fn, 3)
3057929d407SMatthew Leach #define arch_initcall_sync(fn) __define_initcall(fn, 3s)
3067929d407SMatthew Leach #define subsys_initcall(fn) __define_initcall(fn, 4)
3077929d407SMatthew Leach #define subsys_initcall_sync(fn) __define_initcall(fn, 4s)
3087929d407SMatthew Leach #define fs_initcall(fn) __define_initcall(fn, 5)
3097929d407SMatthew Leach #define fs_initcall_sync(fn) __define_initcall(fn, 5s)
3107929d407SMatthew Leach #define rootfs_initcall(fn) __define_initcall(fn, rootfs)
3117929d407SMatthew Leach #define device_initcall(fn) __define_initcall(fn, 6)
3127929d407SMatthew Leach #define device_initcall_sync(fn) __define_initcall(fn, 6s)
3137929d407SMatthew Leach #define late_initcall(fn) __define_initcall(fn, 7)
3147929d407SMatthew Leach #define late_initcall_sync(fn) __define_initcall(fn, 7s)
3151da177e4SLinus Torvalds
3161da177e4SLinus Torvalds #define __initcall(fn) device_initcall(fn)
3171da177e4SLinus Torvalds
3181da177e4SLinus Torvalds #define __exitcall(fn) \
3191da177e4SLinus Torvalds static exitcall_t __exitcall_##fn __exit_call = fn
3201da177e4SLinus Torvalds
321a8cccdd9SSami Tolvanen #define console_initcall(fn) ___define_initcall(fn, con, .con_initcall)
3221da177e4SLinus Torvalds
3231da177e4SLinus Torvalds struct obs_kernel_param {
3241da177e4SLinus Torvalds const char *str;
3251da177e4SLinus Torvalds int (*setup_func)(char *);
3261da177e4SLinus Torvalds int early;
3271da177e4SLinus Torvalds };
3281da177e4SLinus Torvalds
329ad1a4830SArnd Bergmann extern const struct obs_kernel_param __setup_start[], __setup_end[];
330ad1a4830SArnd Bergmann
3311da177e4SLinus Torvalds /*
3321da177e4SLinus Torvalds * Only for really core code. See moduleparam.h for the normal way.
3331da177e4SLinus Torvalds *
3341da177e4SLinus Torvalds * Force the alignment so the compiler doesn't space elements of the
3351da177e4SLinus Torvalds * obs_kernel_param "array" too far apart in .init.setup.
3361da177e4SLinus Torvalds */
3371da177e4SLinus Torvalds #define __setup_param(str, unique_id, fn, early) \
338fd6c3a8dSJan Beulich static const char __setup_str_##unique_id[] __initconst \
339fd6c3a8dSJan Beulich __aligned(1) = str; \
3401da177e4SLinus Torvalds static struct obs_kernel_param __setup_##unique_id \
34133def849SJoe Perches __used __section(".init.setup") \
342147ad605SJohan Hovold __aligned(__alignof__(struct obs_kernel_param)) \
3431da177e4SLinus Torvalds = { __setup_str_##unique_id, fn, early }
3441da177e4SLinus Torvalds
345abc7da58SRandy Dunlap /*
346abc7da58SRandy Dunlap * NOTE: __setup functions return values:
347abc7da58SRandy Dunlap * @fn returns 1 (or non-zero) if the option argument is "handled"
348abc7da58SRandy Dunlap * and returns 0 if the option argument is "not handled".
349abc7da58SRandy Dunlap */
3501da177e4SLinus Torvalds #define __setup(str, fn) \
3511da177e4SLinus Torvalds __setup_param(str, fn, fn, 0)
3521da177e4SLinus Torvalds
353c281b945SIngo Molnar /*
354abc7da58SRandy Dunlap * NOTE: @fn is as per module_param, not __setup!
355abc7da58SRandy Dunlap * I.e., @fn returns 0 for no error or non-zero for error
356abc7da58SRandy Dunlap * (possibly @fn returns a -errno value, but it does not matter).
357abc7da58SRandy Dunlap * Emits warning if @fn returns non-zero.
358c281b945SIngo Molnar */
3591da177e4SLinus Torvalds #define early_param(str, fn) \
3601da177e4SLinus Torvalds __setup_param(str, fn, fn, 1)
3611da177e4SLinus Torvalds
362bfb33badSLuis R. Rodriguez #define early_param_on_off(str_on, str_off, var, config) \
363c281b945SIngo Molnar \
364bfb33badSLuis R. Rodriguez int var = IS_ENABLED(config); \
365c281b945SIngo Molnar \
366bfb33badSLuis R. Rodriguez static int __init parse_##var##_on(char *arg) \
367bfb33badSLuis R. Rodriguez { \
368bfb33badSLuis R. Rodriguez var = 1; \
369bfb33badSLuis R. Rodriguez return 0; \
370bfb33badSLuis R. Rodriguez } \
371a5a673f7SMasahiro Yamada early_param(str_on, parse_##var##_on); \
372c281b945SIngo Molnar \
373bfb33badSLuis R. Rodriguez static int __init parse_##var##_off(char *arg) \
374bfb33badSLuis R. Rodriguez { \
375bfb33badSLuis R. Rodriguez var = 0; \
376bfb33badSLuis R. Rodriguez return 0; \
377bfb33badSLuis R. Rodriguez } \
378a5a673f7SMasahiro Yamada early_param(str_off, parse_##var##_off)
379bfb33badSLuis R. Rodriguez
38030d7e0d4SAlon Bar-Lev /* Relies on boot_command_line being set */
3811da177e4SLinus Torvalds void __init parse_early_param(void);
38213977091SMagnus Damm void __init parse_early_options(char *cmdline);
3831da177e4SLinus Torvalds #endif /* __ASSEMBLY__ */
3841da177e4SLinus Torvalds
3851da177e4SLinus Torvalds #else /* MODULE */
3861da177e4SLinus Torvalds
3871da177e4SLinus Torvalds #define __setup_param(str, unique_id, fn) /* nothing */
3881da177e4SLinus Torvalds #define __setup(str, func) /* nothing */
3891da177e4SLinus Torvalds #endif
3901da177e4SLinus Torvalds
391ab3bfca7SJohannes Berg /* Data marked not to be saved by software suspend */
39233def849SJoe Perches #define __nosavedata __section(".data..nosave")
3931da177e4SLinus Torvalds
3941da177e4SLinus Torvalds #ifdef MODULE
3951da177e4SLinus Torvalds #define __exit_p(x) x
3961da177e4SLinus Torvalds #else
3971da177e4SLinus Torvalds #define __exit_p(x) NULL
3981da177e4SLinus Torvalds #endif
3991da177e4SLinus Torvalds
4001da177e4SLinus Torvalds #endif /* _LINUX_INIT_H */
401