xref: /linux-6.15/include/linux/init.h (revision 73db3abd)
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