Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _LINUX_INIT_H 3 : : #define _LINUX_INIT_H 4 : : 5 : : #include <linux/compiler.h> 6 : : #include <linux/types.h> 7 : : 8 : : /* Built-in __init functions needn't be compiled with retpoline */ 9 : : #if defined(__noretpoline) && !defined(MODULE) 10 : : #define __noinitretpoline __noretpoline 11 : : #else 12 : : #define __noinitretpoline 13 : : #endif 14 : : 15 : : /* These macros are used to mark some functions or 16 : : * initialized data (doesn't apply to uninitialized data) 17 : : * as `initialization' functions. The kernel can take this 18 : : * as hint that the function is used only during the initialization 19 : : * phase and free up used memory resources after 20 : : * 21 : : * Usage: 22 : : * For functions: 23 : : * 24 : : * You should add __init immediately before the function name, like: 25 : : * 26 : : * static void __init initme(int x, int y) 27 : : * { 28 : : * extern int z; z = x * y; 29 : : * } 30 : : * 31 : : * If the function has a prototype somewhere, you can also add 32 : : * __init between closing brace of the prototype and semicolon: 33 : : * 34 : : * extern int initialize_foobar_device(int, int, int) __init; 35 : : * 36 : : * For initialized data: 37 : : * You should insert __initdata or __initconst between the variable name 38 : : * and equal sign followed by value, e.g.: 39 : : * 40 : : * static int init_variable __initdata = 0; 41 : : * static const char linux_logo[] __initconst = { 0x32, 0x36, ... }; 42 : : * 43 : : * Don't forget to initialize data not at file scope, i.e. within a function, 44 : : * as gcc otherwise puts the data into the bss section and not into the init 45 : : * section. 46 : : */ 47 : : 48 : : /* These are for everybody (although not all archs will actually 49 : : discard it in modules) */ 50 : : #define __init __section(.init.text) __cold __latent_entropy __noinitretpoline 51 : : #define __initdata __section(.init.data) 52 : : #define __initconst __section(.init.rodata) 53 : : #define __exitdata __section(.exit.data) 54 : : #define __exit_call __used __section(.exitcall.exit) 55 : : 56 : : /* 57 : : * modpost check for section mismatches during the kernel build. 58 : : * A section mismatch happens when there are references from a 59 : : * code or data section to an init section (both code or data). 60 : : * The init sections are (for most archs) discarded by the kernel 61 : : * when early init has completed so all such references are potential bugs. 62 : : * For exit sections the same issue exists. 63 : : * 64 : : * The following markers are used for the cases where the reference to 65 : : * the *init / *exit section (code or data) is valid and will teach 66 : : * modpost not to issue a warning. Intended semantics is that a code or 67 : : * data tagged __ref* can reference code or data from init section without 68 : : * producing a warning (of course, no warning does not mean code is 69 : : * correct, so optimally document why the __ref is needed and why it's OK). 70 : : * 71 : : * The markers follow same syntax rules as __init / __initdata. 72 : : */ 73 : : #define __ref __section(.ref.text) noinline 74 : : #define __refdata __section(.ref.data) 75 : : #define __refconst __section(.ref.rodata) 76 : : 77 : : #ifdef MODULE 78 : : #define __exitused 79 : : #else 80 : : #define __exitused __used 81 : : #endif 82 : : 83 : : #define __exit __section(.exit.text) __exitused __cold notrace 84 : : 85 : : /* Used for MEMORY_HOTPLUG */ 86 : : #define __meminit __section(.meminit.text) __cold notrace \ 87 : : __latent_entropy 88 : : #define __meminitdata __section(.meminit.data) 89 : : #define __meminitconst __section(.meminit.rodata) 90 : : #define __memexit __section(.memexit.text) __exitused __cold notrace 91 : : #define __memexitdata __section(.memexit.data) 92 : : #define __memexitconst __section(.memexit.rodata) 93 : : 94 : : /* For assembly routines */ 95 : : #define __HEAD .section ".head.text","ax" 96 : : #define __INIT .section ".init.text","ax" 97 : : #define __FINIT .previous 98 : : 99 : : #define __INITDATA .section ".init.data","aw",%progbits 100 : : #define __INITRODATA .section ".init.rodata","a",%progbits 101 : : #define __FINITDATA .previous 102 : : 103 : : #define __MEMINIT .section ".meminit.text", "ax" 104 : : #define __MEMINITDATA .section ".meminit.data", "aw" 105 : : #define __MEMINITRODATA .section ".meminit.rodata", "a" 106 : : 107 : : /* silence warnings when references are OK */ 108 : : #define __REF .section ".ref.text", "ax" 109 : : #define __REFDATA .section ".ref.data", "aw" 110 : : #define __REFCONST .section ".ref.rodata", "a" 111 : : 112 : : #ifndef __ASSEMBLY__ 113 : : /* 114 : : * Used for initialization calls.. 115 : : */ 116 : : typedef int (*initcall_t)(void); 117 : : typedef void (*exitcall_t)(void); 118 : : 119 : : #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS 120 : : typedef int initcall_entry_t; 121 : : 122 : : static inline initcall_t initcall_from_entry(initcall_entry_t *entry) 123 : : { 124 : : return offset_to_ptr(entry); 125 : : } 126 : : #else 127 : : typedef initcall_t initcall_entry_t; 128 : : 129 : : static inline initcall_t initcall_from_entry(initcall_entry_t *entry) 130 : : { 131 : 3 : return *entry; 132 : : } 133 : : #endif 134 : : 135 : : extern initcall_entry_t __con_initcall_start[], __con_initcall_end[]; 136 : : 137 : : /* Used for contructor calls. */ 138 : : typedef void (*ctor_fn_t)(void); 139 : : 140 : : struct file_system_type; 141 : : 142 : : /* Defined in init/main.c */ 143 : : extern int do_one_initcall(initcall_t fn); 144 : : extern char __initdata boot_command_line[]; 145 : : extern char *saved_command_line; 146 : : extern unsigned int reset_devices; 147 : : 148 : : /* used by init/main.c */ 149 : : void setup_arch(char **); 150 : : void prepare_namespace(void); 151 : : void __init init_rootfs(void); 152 : : extern struct file_system_type rootfs_fs_type; 153 : : 154 : : #if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX) 155 : : extern bool rodata_enabled; 156 : : #endif 157 : : #ifdef CONFIG_STRICT_KERNEL_RWX 158 : : void mark_rodata_ro(void); 159 : : #endif 160 : : 161 : : extern void (*late_time_init)(void); 162 : : 163 : : extern bool initcall_debug; 164 : : 165 : : #endif 166 : : 167 : : #ifndef MODULE 168 : : 169 : : #ifndef __ASSEMBLY__ 170 : : 171 : : /* 172 : : * initcalls are now grouped by functionality into separate 173 : : * subsections. Ordering inside the subsections is determined 174 : : * by link order. 175 : : * For backwards compatibility, initcall() puts the call in 176 : : * the device init subsection. 177 : : * 178 : : * The `id' arg to __define_initcall() is needed so that multiple initcalls 179 : : * can point at the same handler without causing duplicate-symbol build errors. 180 : : * 181 : : * Initcalls are run by placing pointers in initcall sections that the 182 : : * kernel iterates at runtime. The linker can do dead code / data elimination 183 : : * and remove that completely, so the initcall sections have to be marked 184 : : * as KEEP() in the linker script. 185 : : */ 186 : : 187 : : #ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS 188 : : #define ___define_initcall(fn, id, __sec) \ 189 : : __ADDRESSABLE(fn) \ 190 : : asm(".section \"" #__sec ".init\", \"a\" \n" \ 191 : : "__initcall_" #fn #id ": \n" \ 192 : : ".long " #fn " - . \n" \ 193 : : ".previous \n"); 194 : : #else 195 : : #define ___define_initcall(fn, id, __sec) \ 196 : : static initcall_t __initcall_##fn##id __used \ 197 : : __attribute__((__section__(#__sec ".init"))) = fn; 198 : : #endif 199 : : 200 : : #define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id) 201 : : 202 : : /* 203 : : * Early initcalls run before initializing SMP. 204 : : * 205 : : * Only for built-in code, not modules. 206 : : */ 207 : : #define early_initcall(fn) __define_initcall(fn, early) 208 : : 209 : : /* 210 : : * A "pure" initcall has no dependencies on anything else, and purely 211 : : * initializes variables that couldn't be statically initialized. 212 : : * 213 : : * This only exists for built-in code, not for modules. 214 : : * Keep main.c:initcall_level_names[] in sync. 215 : : */ 216 : : #define pure_initcall(fn) __define_initcall(fn, 0) 217 : : 218 : : #define core_initcall(fn) __define_initcall(fn, 1) 219 : : #define core_initcall_sync(fn) __define_initcall(fn, 1s) 220 : : #define postcore_initcall(fn) __define_initcall(fn, 2) 221 : : #define postcore_initcall_sync(fn) __define_initcall(fn, 2s) 222 : : #define arch_initcall(fn) __define_initcall(fn, 3) 223 : : #define arch_initcall_sync(fn) __define_initcall(fn, 3s) 224 : : #define subsys_initcall(fn) __define_initcall(fn, 4) 225 : : #define subsys_initcall_sync(fn) __define_initcall(fn, 4s) 226 : : #define fs_initcall(fn) __define_initcall(fn, 5) 227 : : #define fs_initcall_sync(fn) __define_initcall(fn, 5s) 228 : : #define rootfs_initcall(fn) __define_initcall(fn, rootfs) 229 : : #define device_initcall(fn) __define_initcall(fn, 6) 230 : : #define device_initcall_sync(fn) __define_initcall(fn, 6s) 231 : : #define late_initcall(fn) __define_initcall(fn, 7) 232 : : #define late_initcall_sync(fn) __define_initcall(fn, 7s) 233 : : 234 : : #define __initcall(fn) device_initcall(fn) 235 : : 236 : : #define __exitcall(fn) \ 237 : : static exitcall_t __exitcall_##fn __exit_call = fn 238 : : 239 : : #define console_initcall(fn) ___define_initcall(fn,, .con_initcall) 240 : : 241 : : struct obs_kernel_param { 242 : : const char *str; 243 : : int (*setup_func)(char *); 244 : : int early; 245 : : }; 246 : : 247 : : /* 248 : : * Only for really core code. See moduleparam.h for the normal way. 249 : : * 250 : : * Force the alignment so the compiler doesn't space elements of the 251 : : * obs_kernel_param "array" too far apart in .init.setup. 252 : : */ 253 : : #define __setup_param(str, unique_id, fn, early) \ 254 : : static const char __setup_str_##unique_id[] __initconst \ 255 : : __aligned(1) = str; \ 256 : : static struct obs_kernel_param __setup_##unique_id \ 257 : : __used __section(.init.setup) \ 258 : : __attribute__((aligned((sizeof(long))))) \ 259 : : = { __setup_str_##unique_id, fn, early } 260 : : 261 : : #define __setup(str, fn) \ 262 : : __setup_param(str, fn, fn, 0) 263 : : 264 : : /* 265 : : * NOTE: fn is as per module_param, not __setup! 266 : : * Emits warning if fn returns non-zero. 267 : : */ 268 : : #define early_param(str, fn) \ 269 : : __setup_param(str, fn, fn, 1) 270 : : 271 : : #define early_param_on_off(str_on, str_off, var, config) \ 272 : : \ 273 : : int var = IS_ENABLED(config); \ 274 : : \ 275 : : static int __init parse_##var##_on(char *arg) \ 276 : : { \ 277 : : var = 1; \ 278 : : return 0; \ 279 : : } \ 280 : : __setup_param(str_on, parse_##var##_on, parse_##var##_on, 1); \ 281 : : \ 282 : : static int __init parse_##var##_off(char *arg) \ 283 : : { \ 284 : : var = 0; \ 285 : : return 0; \ 286 : : } \ 287 : : __setup_param(str_off, parse_##var##_off, parse_##var##_off, 1) 288 : : 289 : : /* Relies on boot_command_line being set */ 290 : : void __init parse_early_param(void); 291 : : void __init parse_early_options(char *cmdline); 292 : : #endif /* __ASSEMBLY__ */ 293 : : 294 : : #else /* MODULE */ 295 : : 296 : : #define __setup_param(str, unique_id, fn) /* nothing */ 297 : : #define __setup(str, func) /* nothing */ 298 : : #endif 299 : : 300 : : /* Data marked not to be saved by software suspend */ 301 : : #define __nosavedata __section(.data..nosave) 302 : : 303 : : #ifdef MODULE 304 : : #define __exit_p(x) x 305 : : #else 306 : : #define __exit_p(x) NULL 307 : : #endif 308 : : 309 : : #endif /* _LINUX_INIT_H */