]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blame - init/main.c
proc: bootconfig: Add /proc/bootconfig to show boot config list
[mirror_ubuntu-hirsute-kernel.git] / init / main.c
CommitLineData
457c8996 1// SPDX-License-Identifier: GPL-2.0-only
1da177e4
LT
2/*
3 * linux/init/main.c
4 *
5 * Copyright (C) 1991, 1992 Linus Torvalds
6 *
7 * GK 2/5/95 - Changed to support mounting root fs via NFS
8 * Added initrd & change_root: Werner Almesberger & Hans Lermen, Feb '96
9 * Moan early if gcc is old, avoiding bogus kernels - Paul Gortmaker, May '96
dd4d9fec 10 * Simplified starting of init: Michael A. Griffith <grif@acm.org>
1da177e4
LT
11 */
12
ea676e84
AM
13#define DEBUG /* Enable initcall_debug */
14
1da177e4 15#include <linux/types.h>
8a293be0 16#include <linux/extable.h>
1da177e4
LT
17#include <linux/module.h>
18#include <linux/proc_fs.h>
5c2c5c55 19#include <linux/binfmts.h>
1da177e4
LT
20#include <linux/kernel.h>
21#include <linux/syscalls.h>
9b5609fd 22#include <linux/stackprotector.h>
1da177e4
LT
23#include <linux/string.h>
24#include <linux/ctype.h>
25#include <linux/delay.h>
1da177e4
LT
26#include <linux/ioport.h>
27#include <linux/init.h>
1da177e4 28#include <linux/initrd.h>
57c8a661 29#include <linux/memblock.h>
4a7a16dc 30#include <linux/acpi.h>
7684b858 31#include <linux/bootconfig.h>
0c688614 32#include <linux/console.h>
38b8d208 33#include <linux/nmi.h>
1da177e4
LT
34#include <linux/percpu.h>
35#include <linux/kmod.h>
db64fe02 36#include <linux/vmalloc.h>
1da177e4 37#include <linux/kernel_stat.h>
d7cd5611 38#include <linux/start_kernel.h>
1da177e4 39#include <linux/security.h>
3d442233 40#include <linux/smp.h>
1da177e4
LT
41#include <linux/profile.h>
42#include <linux/rcupdate.h>
43#include <linux/moduleparam.h>
44#include <linux/kallsyms.h>
45#include <linux/writeback.h>
46#include <linux/cpu.h>
47#include <linux/cpuset.h>
ddbcc7e8 48#include <linux/cgroup.h>
1da177e4 49#include <linux/efi.h>
906568c9 50#include <linux/tick.h>
78634061 51#include <linux/sched/isolation.h>
6168a702 52#include <linux/interrupt.h>
c757249a 53#include <linux/taskstats_kern.h>
ca74e92b 54#include <linux/delayacct.h>
1da177e4 55#include <linux/unistd.h>
3ea056c5 56#include <linux/utsname.h>
1da177e4
LT
57#include <linux/rmap.h>
58#include <linux/mempolicy.h>
59#include <linux/key.h>
b6cd0b77 60#include <linux/buffer_head.h>
eefa864b 61#include <linux/page_ext.h>
9a11b49a 62#include <linux/debug_locks.h>
3ac7fe5a 63#include <linux/debugobjects.h>
fbb9ce95 64#include <linux/lockdep.h>
3c7b4e6b 65#include <linux/kmemleak.h>
84d73786 66#include <linux/pid_namespace.h>
1f21782e 67#include <linux/device.h>
73c27992 68#include <linux/kthread.h>
e6fe6649 69#include <linux/sched.h>
1777e463 70#include <linux/sched/init.h>
a1c9eea9 71#include <linux/signal.h>
199f0ca5 72#include <linux/idr.h>
0b4b3827 73#include <linux/kgdb.h>
68bf21aa 74#include <linux/ftrace.h>
22a9d645 75#include <linux/async.h>
6ae6996a 76#include <linux/sfi.h>
2b2af54a 77#include <linux/shmem_fs.h>
5a0e3ad6 78#include <linux/slab.h>
24a24bb6 79#include <linux/perf_event.h>
a74fb73c 80#include <linux/ptrace.h>
aa8c6248 81#include <linux/pti.h>
bb813f4c
TH
82#include <linux/blkdev.h>
83#include <linux/elevator.h>
5d2a4e91 84#include <linux/sched/clock.h>
29930025 85#include <linux/sched/task.h>
68db0cf1 86#include <linux/sched/task_stack.h>
65f382fd 87#include <linux/context_tracking.h>
47d06e53 88#include <linux/random.h>
7b0b73d7 89#include <linux/list.h>
c9cd2ce2 90#include <linux/integrity.h>
e149ed2b 91#include <linux/proc_ns.h>
0ddab1d2 92#include <linux/io.h>
39290b38 93#include <linux/cache.h>
2959a5f7 94#include <linux/rodata_test.h>
33352244 95#include <linux/jump_label.h>
ae67d58d 96#include <linux/mem_encrypt.h>
1da177e4
LT
97
98#include <asm/io.h>
99#include <asm/bugs.h>
100#include <asm/setup.h>
a940199f 101#include <asm/sections.h>
37b73c82 102#include <asm/cacheflush.h>
1da177e4 103
4ee7c60d
SRV
104#define CREATE_TRACE_POINTS
105#include <trace/events/initcall.h>
106
aae5f662 107static int kernel_init(void *);
1da177e4
LT
108
109extern void init_IRQ(void);
1da177e4 110extern void radix_tree_init(void);
1da177e4 111
2ce802f6
TH
112/*
113 * Debug helper: via this flag we know that we are in 'early bootup code'
114 * where only the boot processor is running with IRQ disabled. This means
115 * two things - IRQ must not be enabled before the flag is cleared and some
116 * operations which are not allowed with IRQ disabled are allowed while the
117 * flag is set.
118 */
119bool early_boot_irqs_disabled __read_mostly;
120
a6826048 121enum system_states system_state __read_mostly;
1da177e4
LT
122EXPORT_SYMBOL(system_state);
123
124/*
125 * Boot command-line arguments
126 */
127#define MAX_INIT_ARGS CONFIG_INIT_ENV_ARG_LIMIT
128#define MAX_INIT_ENVS CONFIG_INIT_ENV_ARG_LIMIT
129
130extern void time_init(void);
131/* Default late time init is NULL. archs can override this later. */
d2e3192b 132void (*__initdata late_time_init)(void);
1da177e4 133
30d7e0d4
ABL
134/* Untouched command line saved by arch-specific code. */
135char __initdata boot_command_line[COMMAND_LINE_SIZE];
136/* Untouched saved command line (eg. for /proc) */
137char *saved_command_line;
138/* Command line for parameter parsing */
139static char *static_command_line;
08746a65
KM
140/* Command line for per-initcall parameter parsing */
141static char *initcall_command_line;
1da177e4
LT
142
143static char *execute_command;
ffdfc409 144static char *ramdisk_execute_command;
1da177e4 145
c4b2c0c5
HFS
146/*
147 * Used to generate warnings if static_key manipulation functions are used
148 * before jump_label_init is called.
149 */
dd4d9fec 150bool static_key_initialized __read_mostly;
c4b2c0c5
HFS
151EXPORT_SYMBOL_GPL(static_key_initialized);
152
8b3b2955
JB
153/*
154 * If set, this is an indication to the drivers that reset the underlying
155 * device before going ahead with the initialization otherwise driver might
156 * rely on the BIOS and skip the reset operation.
157 *
158 * This is useful if kernel is booting in an unreliable environment.
fc454fdc 159 * For ex. kdump situation where previous kernel has crashed, BIOS has been
8b3b2955
JB
160 * skipped and devices will be in unknown state.
161 */
162unsigned int reset_devices;
163EXPORT_SYMBOL(reset_devices);
1da177e4 164
7e96287d
VG
165static int __init set_reset_devices(char *str)
166{
167 reset_devices = 1;
168 return 1;
169}
170
171__setup("reset_devices", set_reset_devices);
172
dd4d9fec
FF
173static const char *argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
174const char *envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };
1da177e4
LT
175static const char *panic_later, *panic_param;
176
914dcaa8 177extern const struct obs_kernel_param __setup_start[], __setup_end[];
1da177e4 178
31c025b5 179static bool __init obsolete_checksetup(char *line)
1da177e4 180{
914dcaa8 181 const struct obs_kernel_param *p;
31c025b5 182 bool had_early_param = false;
1da177e4
LT
183
184 p = __setup_start;
185 do {
186 int n = strlen(p->str);
b1e4d20c 187 if (parameqn(line, p->str, n)) {
1da177e4 188 if (p->early) {
33df0d19
RR
189 /* Already done in parse_early_param?
190 * (Needs exact match on param part).
191 * Keep iterating, as we can have early
192 * params and __setups of same names 8( */
1da177e4 193 if (line[n] == '\0' || line[n] == '=')
31c025b5 194 had_early_param = true;
1da177e4 195 } else if (!p->setup_func) {
ea676e84
AM
196 pr_warn("Parameter %s is obsolete, ignored\n",
197 p->str);
31c025b5 198 return true;
1da177e4 199 } else if (p->setup_func(line + n))
31c025b5 200 return true;
1da177e4
LT
201 }
202 p++;
203 } while (p < __setup_end);
33df0d19
RR
204
205 return had_early_param;
1da177e4
LT
206}
207
208/*
209 * This should be approx 2 Bo*oMips to start (note initial shift), and will
210 * still work even if initially too large, it will just take slightly longer
211 */
212unsigned long loops_per_jiffy = (1<<12);
1da177e4
LT
213EXPORT_SYMBOL(loops_per_jiffy);
214
215static int __init debug_kernel(char *str)
216{
a8fe19eb 217 console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
f6f21c81 218 return 0;
1da177e4
LT
219}
220
221static int __init quiet_kernel(char *str)
222{
a8fe19eb 223 console_loglevel = CONSOLE_LOGLEVEL_QUIET;
f6f21c81 224 return 0;
1da177e4
LT
225}
226
f6f21c81
YL
227early_param("debug", debug_kernel);
228early_param("quiet", quiet_kernel);
1da177e4
LT
229
230static int __init loglevel(char *str)
231{
808bf29b
AS
232 int newlevel;
233
234 /*
235 * Only update loglevel value when a correct setting was passed,
236 * to prevent blind crashes (when loglevel being set to 0) that
237 * are quite hard to debug
238 */
239 if (get_option(&str, &newlevel)) {
240 console_loglevel = newlevel;
241 return 0;
242 }
243
244 return -EINVAL;
1da177e4
LT
245}
246
f6f21c81 247early_param("loglevel", loglevel);
1da177e4 248
7684b858
MH
249#ifdef CONFIG_BOOT_CONFIG
250u32 boot_config_checksum(unsigned char *p, u32 size)
251{
252 u32 ret = 0;
253
254 while (size--)
255 ret += *p++;
256
257 return ret;
258}
259
260static void __init setup_boot_config(void)
261{
262 u32 size, csum;
263 char *data, *copy;
264 u32 *hdr;
265
266 if (!initrd_end)
267 return;
268
269 hdr = (u32 *)(initrd_end - 8);
270 size = hdr[0];
271 csum = hdr[1];
272
273 if (size >= XBC_DATA_MAX)
274 return;
275
276 data = ((void *)hdr) - size;
277 if ((unsigned long)data < initrd_start)
278 return;
279
280 if (boot_config_checksum((unsigned char *)data, size) != csum)
281 return;
282
283 copy = memblock_alloc(size + 1, SMP_CACHE_BYTES);
284 if (!copy) {
285 pr_err("Failed to allocate memory for boot config\n");
286 return;
287 }
288
289 memcpy(copy, data, size);
290 copy[size] = '\0';
291
292 if (xbc_init(copy) < 0)
293 pr_err("Failed to parse boot config\n");
294 else
295 pr_info("Load boot config: %d bytes\n", size);
296}
297#else
298#define setup_boot_config() do { } while (0)
299#endif
300
a99cd112 301/* Change NUL term back to "=", to make "param" the whole string. */
ecc86170
LR
302static int __init repair_env_string(char *param, char *val,
303 const char *unused, void *arg)
1da177e4 304{
1da177e4
LT
305 if (val) {
306 /* param=val or param="val"? */
307 if (val == param+strlen(param)+1)
308 val[-1] = '=';
309 else if (val == param+strlen(param)+2) {
310 val[-2] = '=';
311 memmove(val-1, val, strlen(val)+1);
312 val--;
313 } else
314 BUG();
315 }
a99cd112
CM
316 return 0;
317}
318
51e158c1 319/* Anything after -- gets handed straight to init. */
ecc86170
LR
320static int __init set_init_arg(char *param, char *val,
321 const char *unused, void *arg)
51e158c1
RR
322{
323 unsigned int i;
324
325 if (panic_later)
326 return 0;
327
ecc86170 328 repair_env_string(param, val, unused, NULL);
51e158c1
RR
329
330 for (i = 0; argv_init[i]; i++) {
331 if (i == MAX_INIT_ARGS) {
332 panic_later = "init";
333 panic_param = param;
334 return 0;
335 }
336 }
337 argv_init[i] = param;
338 return 0;
339}
340
a99cd112
CM
341/*
342 * Unknown boot options get handed to init, unless they look like
343 * unused parameters (modprobe will find them in /proc/cmdline).
344 */
ecc86170
LR
345static int __init unknown_bootoption(char *param, char *val,
346 const char *unused, void *arg)
a99cd112 347{
ecc86170 348 repair_env_string(param, val, unused, NULL);
1da177e4
LT
349
350 /* Handle obsolete-style parameters */
351 if (obsolete_checksetup(param))
352 return 0;
353
f066a4f6
RR
354 /* Unused module parameter. */
355 if (strchr(param, '.') && (!val || strchr(param, '.') < val))
1da177e4 356 return 0;
1da177e4
LT
357
358 if (panic_later)
359 return 0;
360
361 if (val) {
362 /* Environment option */
363 unsigned int i;
364 for (i = 0; envp_init[i]; i++) {
365 if (i == MAX_INIT_ENVS) {
499a4584 366 panic_later = "env";
1da177e4
LT
367 panic_param = param;
368 }
369 if (!strncmp(param, envp_init[i], val - param))
370 break;
371 }
372 envp_init[i] = param;
373 } else {
374 /* Command line option */
375 unsigned int i;
376 for (i = 0; argv_init[i]; i++) {
377 if (i == MAX_INIT_ARGS) {
499a4584 378 panic_later = "init";
1da177e4
LT
379 panic_param = param;
380 }
381 }
382 argv_init[i] = param;
383 }
384 return 0;
385}
386
387static int __init init_setup(char *str)
388{
389 unsigned int i;
390
391 execute_command = str;
392 /*
393 * In case LILO is going to boot us with default command line,
394 * it prepends "auto" before the whole cmdline which makes
395 * the shell think it should execute a script with such name.
396 * So we ignore all arguments entered _before_ init=... [MJ]
397 */
398 for (i = 1; i < MAX_INIT_ARGS; i++)
399 argv_init[i] = NULL;
400 return 1;
401}
402__setup("init=", init_setup);
403
ffdfc409
OJ
404static int __init rdinit_setup(char *str)
405{
406 unsigned int i;
407
408 ramdisk_execute_command = str;
409 /* See "auto" comment in init_setup */
410 for (i = 1; i < MAX_INIT_ARGS; i++)
411 argv_init[i] = NULL;
412 return 1;
413}
414__setup("rdinit=", rdinit_setup);
415
1da177e4 416#ifndef CONFIG_SMP
34db18a0 417static const unsigned int setup_max_cpus = NR_CPUS;
e0982e90 418static inline void setup_nr_cpu_ids(void) { }
1da177e4 419static inline void smp_prepare_cpus(unsigned int maxcpus) { }
1da177e4
LT
420#endif
421
30d7e0d4
ABL
422/*
423 * We need to store the untouched command line for future reference.
424 * We also need to store the touched command line since the parameter
425 * parsing is performed in place, and we should allow a component to
426 * store reference of name/value for future reference.
427 */
428static void __init setup_command_line(char *command_line)
429{
f5c7310a
MR
430 size_t len = strlen(boot_command_line) + 1;
431
432 saved_command_line = memblock_alloc(len, SMP_CACHE_BYTES);
433 if (!saved_command_line)
434 panic("%s: Failed to allocate %zu bytes\n", __func__, len);
435
436 initcall_command_line = memblock_alloc(len, SMP_CACHE_BYTES);
437 if (!initcall_command_line)
438 panic("%s: Failed to allocate %zu bytes\n", __func__, len);
439
440 static_command_line = memblock_alloc(len, SMP_CACHE_BYTES);
441 if (!static_command_line)
442 panic("%s: Failed to allocate %zu bytes\n", __func__, len);
443
dd4d9fec
FF
444 strcpy(saved_command_line, boot_command_line);
445 strcpy(static_command_line, command_line);
30d7e0d4
ABL
446}
447
1da177e4
LT
448/*
449 * We need to finalize in a non-__init function or else race conditions
450 * between the root thread and the init thread may cause start_kernel to
451 * be reaped by free_initmem before the root thread has proceeded to
452 * cpu_idle.
453 *
454 * gcc-3.4 accidentally inlines this function, so use noinline.
455 */
456
b433c3d4
PZ
457static __initdata DECLARE_COMPLETION(kthreadd_done);
458
53c99bd6 459noinline void __ref rest_init(void)
1da177e4 460{
8fb12156 461 struct task_struct *tsk;
73c27992
EB
462 int pid;
463
7db905e6 464 rcu_scheduler_starting();
b433c3d4 465 /*
97158569 466 * We need to spawn init first so that it obtains pid 1, however
b433c3d4
PZ
467 * the init task will end up wanting to create kthreads, which, if
468 * we schedule it before we create kthreadd, will OOPS.
469 */
8fb12156
TG
470 pid = kernel_thread(kernel_init, NULL, CLONE_FS);
471 /*
472 * Pin init on the boot CPU. Task migration is not properly working
473 * until sched_init_smp() has been run. It will set the allowed
474 * CPUs for init to the non isolated CPUs.
475 */
476 rcu_read_lock();
477 tsk = find_task_by_pid_ns(pid, &init_pid_ns);
478 set_cpus_allowed_ptr(tsk, cpumask_of(smp_processor_id()));
479 rcu_read_unlock();
480
1da177e4 481 numa_default_policy();
73c27992 482 pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
d11c563d 483 rcu_read_lock();
5cd20455 484 kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
d11c563d 485 rcu_read_unlock();
1c3c5eab
TG
486
487 /*
488 * Enable might_sleep() and smp_processor_id() checks.
c1a280b6 489 * They cannot be enabled earlier because with CONFIG_PREEMPTION=y
1c3c5eab
TG
490 * kernel_thread() would trigger might_sleep() splats. With
491 * CONFIG_PREEMPT_VOLUNTARY=y the init task might have scheduled
492 * already, but it's stuck on the kthreadd_done completion.
493 */
494 system_state = SYSTEM_SCHEDULING;
495
b433c3d4 496 complete(&kthreadd_done);
f340c0d1
IM
497
498 /*
499 * The boot idle thread must execute schedule()
1df21055 500 * at least once to get things moving:
f340c0d1 501 */
bd2f5536 502 schedule_preempt_disabled();
5bfb5d69 503 /* Call into cpu_idle with preempt disabled */
a1a04ec3 504 cpu_startup_entry(CPUHP_ONLINE);
1df21055 505}
1da177e4
LT
506
507/* Check for early params. */
ecc86170
LR
508static int __init do_early_param(char *param, char *val,
509 const char *unused, void *arg)
1da177e4 510{
914dcaa8 511 const struct obs_kernel_param *p;
1da177e4
LT
512
513 for (p = __setup_start; p < __setup_end; p++) {
b1e4d20c 514 if ((p->early && parameq(param, p->str)) ||
18a8bd94
YL
515 (strcmp(param, "console") == 0 &&
516 strcmp(p->str, "earlycon") == 0)
517 ) {
1da177e4 518 if (p->setup_func(val) != 0)
ea676e84 519 pr_warn("Malformed early option '%s'\n", param);
1da177e4
LT
520 }
521 }
522 /* We accept everything at this stage. */
523 return 0;
524}
525
13977091
MD
526void __init parse_early_options(char *cmdline)
527{
ecc86170
LR
528 parse_args("early options", cmdline, NULL, 0, 0, 0, NULL,
529 do_early_param);
13977091
MD
530}
531
1da177e4
LT
532/* Arch code calls this early on, or if not, just before other parsing. */
533void __init parse_early_param(void)
534{
dd4d9fec
FF
535 static int done __initdata;
536 static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata;
1da177e4
LT
537
538 if (done)
539 return;
540
541 /* All fall through to do_early_param. */
30d7e0d4 542 strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
13977091 543 parse_early_options(tmp_cmdline);
1da177e4
LT
544 done = 1;
545}
546
e7ff3a47
TG
547void __init __weak arch_post_acpi_subsys_init(void) { }
548
839ad62e 549void __init __weak smp_setup_processor_id(void)
033ab7f8
AM
550{
551}
552
eded09cc 553# if THREAD_SIZE >= PAGE_SIZE
b235beea 554void __init __weak thread_stack_cache_init(void)
8c9843e5
BH
555{
556}
eded09cc 557#endif
8c9843e5 558
c7753208
TL
559void __init __weak mem_encrypt_init(void) { }
560
4fc19708
NA
561void __init __weak poking_init(void) { }
562
782de70c 563void __init __weak pgtable_cache_init(void) { }
caa84136 564
4e37958d
SRV
565bool initcall_debug;
566core_param(initcall_debug, initcall_debug, bool, 0644);
b0dc52f1
SRV
567
568#ifdef TRACEPOINTS_ENABLED
4e37958d 569static void __init initcall_debug_enable(void);
b0dc52f1
SRV
570#else
571static inline void initcall_debug_enable(void)
572{
573}
574#endif
4e37958d 575
23a5c8cb
AP
576/* Report memory auto-initialization states for this boot. */
577static void __init report_meminit(void)
578{
579 const char *stack;
580
581 if (IS_ENABLED(CONFIG_INIT_STACK_ALL))
582 stack = "all";
583 else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL))
584 stack = "byref_all";
585 else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF))
586 stack = "byref";
587 else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_USER))
588 stack = "__user";
589 else
590 stack = "off";
591
592 pr_info("mem auto-init: stack:%s, heap alloc:%s, heap free:%s\n",
593 stack, want_init_on_alloc(GFP_KERNEL) ? "on" : "off",
594 want_init_on_free() ? "on" : "off");
595 if (want_init_on_free())
596 pr_info("mem auto-init: clearing system memory may take some time...\n");
597}
598
444f478f
PE
599/*
600 * Set up kernel memory allocators
601 */
602static void __init mm_init(void)
603{
eefa864b
JK
604 /*
605 * page_ext requires contiguous pages,
606 * bigger than MAX_ORDER unless SPARSEMEM.
607 */
608 page_ext_init_flatmem();
23a5c8cb 609 report_meminit();
444f478f
PE
610 mem_init();
611 kmem_cache_init();
c5665868 612 kmemleak_init();
b35f1819 613 pgtable_init();
a9ee3a63 614 debug_objects_mem_init();
444f478f 615 vmalloc_init();
0ddab1d2 616 ioremap_huge_init();
613e396b
TG
617 /* Should be run before the first non-init thread is created */
618 init_espfix_bsp();
aa8c6248
TG
619 /* Should be run after espfix64 is set up. */
620 pti_init();
444f478f
PE
621}
622
53c99bd6
MS
623void __init __weak arch_call_rest_init(void)
624{
625 rest_init();
626}
627
722a9f92 628asmlinkage __visible void __init start_kernel(void)
1da177e4 629{
dd4d9fec
FF
630 char *command_line;
631 char *after_dashes;
033ab7f8 632
d4311ff1 633 set_task_stack_end_magic(&init_task);
73839c5b 634 smp_setup_processor_id();
3ac7fe5a 635 debug_objects_early_init();
42059429 636
ddbcc7e8 637 cgroup_init_early();
fbb9ce95
IM
638
639 local_irq_disable();
2ce802f6 640 early_boot_irqs_disabled = true;
fbb9ce95 641
1b3b3b49
VK
642 /*
643 * Interrupts are still disabled. Do necessary setups, then
644 * enable them.
645 */
44fd2299 646 boot_cpu_init();
1da177e4 647 page_address_init();
ea676e84 648 pr_notice("%s", linux_banner);
e6b1db98 649 early_security_init();
1da177e4 650 setup_arch(&command_line);
7684b858 651 setup_boot_config();
30d7e0d4 652 setup_command_line(command_line);
e0982e90 653 setup_nr_cpu_ids();
d6647bdf 654 setup_per_cpu_areas();
44fd2299 655 smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
b5b1404d 656 boot_cpu_hotplug_init();
1da177e4 657
72675e13 658 build_all_zonelists(NULL);
83b519e8
PE
659 page_alloc_init();
660
ea676e84 661 pr_notice("Kernel command line: %s\n", boot_command_line);
6041186a
DW
662 /* parameters may set static keys */
663 jump_label_init();
83b519e8 664 parse_early_param();
51e158c1
RR
665 after_dashes = parse_args("Booting kernel",
666 static_command_line, __start___param,
667 __stop___param - __start___param,
ecc86170 668 -1, -1, NULL, &unknown_bootoption);
3438cf54 669 if (!IS_ERR_OR_NULL(after_dashes))
51e158c1 670 parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
ecc86170 671 NULL, set_init_arg);
97ce2c88 672
83b519e8
PE
673 /*
674 * These use large bootmem allocations and must precede
675 * kmem_cache_init()
676 */
162a7e75 677 setup_log_buf(0);
83b519e8
PE
678 vfs_caches_init_early();
679 sort_main_extable();
680 trap_init();
444f478f 681 mm_init();
de03c72c 682
f631718d
SRV
683 ftrace_init();
684
e725c731
SRV
685 /* trace_printk can be enabled here */
686 early_trace_init();
687
1da177e4
LT
688 /*
689 * Set up the scheduler prior starting any interrupts (such as the
690 * timer interrupt). Full topology setup happens at smp_init()
691 * time - but meanwhile we still have a functioning scheduler.
692 */
693 sched_init();
694 /*
695 * Disable preemption - early bootup scheduling is extremely
696 * fragile until we cpu_idle() for the first time.
697 */
698 preempt_disable();
dd4d9fec
FF
699 if (WARN(!irqs_disabled(),
700 "Interrupts were enabled *very* early, fixing it\n"))
c4a68306 701 local_irq_disable();
0a835c4f 702 radix_tree_init();
3347fa09 703
7d229c66
TS
704 /*
705 * Set up housekeeping before setting up workqueues to allow the unbound
706 * workqueue to take non-housekeeping into account.
707 */
708 housekeeping_init();
709
3347fa09
TH
710 /*
711 * Allow workqueue creation and work item queueing/cancelling
712 * early. Work item execution depends on kthreads and starts after
713 * workqueue_init().
714 */
715 workqueue_init_early();
716
1da177e4 717 rcu_init();
5f893b26 718
e725c731 719 /* Trace events are available after this */
5f893b26
SRRH
720 trace_init();
721
4e37958d
SRV
722 if (initcall_debug)
723 initcall_debug_enable();
724
65f382fd 725 context_tracking_init();
0b8f1efa
YL
726 /* init some links before init_ISA_irqs() */
727 early_irq_init();
1da177e4 728 init_IRQ();
ad2b1353 729 tick_init();
d6dd50e0 730 rcu_init_nohz();
1da177e4 731 init_timers();
c0a31329 732 hrtimers_init();
1da177e4 733 softirq_init();
ad596171 734 timekeeping_init();
d5553523
KC
735
736 /*
737 * For best initial stack canary entropy, prepare it after:
738 * - setup_arch() for any UEFI RNG entropy and boot cmdline access
739 * - timekeeping_init() for ktime entropy used in rand_initialize()
740 * - rand_initialize() to get any arch-specific entropy like RDRAND
741 * - add_latent_entropy() to get any latent entropy
742 * - adding command line entropy
743 */
744 rand_initialize();
745 add_latent_entropy();
746 add_device_randomness(command_line, strlen(command_line));
747 boot_init_stack_canary();
748
88fecaa2 749 time_init();
f92bac3b 750 printk_safe_init();
9e630205 751 perf_event_init();
93e02814 752 profile_init();
d8ad7d11 753 call_function_init();
f91eb62f 754 WARN(!irqs_disabled(), "Interrupts were enabled early\n");
c3bc8fd6 755
2ce802f6 756 early_boot_irqs_disabled = false;
93e02814 757 local_irq_enable();
dcce284a 758
7e85ee0c 759 kmem_cache_init_late();
1da177e4
LT
760
761 /*
762 * HACK ALERT! This is early. We're enabling the console before
763 * we've done PCI setups etc, and console_init() must be aware of
764 * this. But we do want output early, in case something goes wrong.
765 */
766 console_init();
767 if (panic_later)
499a4584
TH
768 panic("Too many boot %s vars at `%s'", panic_later,
769 panic_param);
fbb9ce95 770
c3bc8fd6 771 lockdep_init();
fbb9ce95 772
9a11b49a
IM
773 /*
774 * Need to run this when irqs are enabled, because it wants
775 * to self-test [hard/soft]-irqs on/off lock inversion bugs
776 * too:
777 */
778 locking_selftest();
779
c7753208
TL
780 /*
781 * This needs to be called before any devices perform DMA
782 * operations that might use the SWIOTLB bounce buffers. It will
783 * mark the bounce buffers as decrypted so that their usage will
784 * not cause "plain-text" data to be decrypted when accessed.
785 */
786 mem_encrypt_init();
787
1da177e4
LT
788#ifdef CONFIG_BLK_DEV_INITRD
789 if (initrd_start && !initrd_below_start_ok &&
bd673c7c 790 page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {
ea676e84 791 pr_crit("initrd overwritten (0x%08lx < 0x%08lx) - disabling it.\n",
bd673c7c
GU
792 page_to_pfn(virt_to_page((void *)initrd_start)),
793 min_low_pfn);
1da177e4
LT
794 initrd_start = 0;
795 }
796#endif
e7c8d5c9 797 setup_per_cpu_pageset();
1da177e4 798 numa_policy_init();
9c71206d 799 acpi_early_init();
1da177e4
LT
800 if (late_time_init)
801 late_time_init();
857baa87 802 sched_clock_init();
1da177e4 803 calibrate_delay();
95846ecf 804 pid_idr_init();
1da177e4 805 anon_vma_init();
11520e5e 806#ifdef CONFIG_X86
83e68189 807 if (efi_enabled(EFI_RUNTIME_SERVICES))
11520e5e
LT
808 efi_enter_virtual_mode();
809#endif
b235beea 810 thread_stack_cache_init();
d84f4f99 811 cred_init();
ff691f6e 812 fork_init();
1da177e4 813 proc_caches_init();
3ea056c5 814 uts_ns_init();
1da177e4 815 buffer_init();
1da177e4
LT
816 key_init();
817 security_init();
0b4b3827 818 dbg_late_init();
4248b0da 819 vfs_caches_init();
62906027 820 pagecache_init();
1da177e4 821 signals_init();
09652320 822 seq_file_init();
1da177e4 823 proc_root_init();
e149ed2b 824 nsfs_init();
1da177e4 825 cpuset_init();
695df213 826 cgroup_init();
c757249a 827 taskstats_init_early();
ca74e92b 828 delayacct_init();
1da177e4 829
4fc19708 830 poking_init();
1da177e4
LT
831 check_bugs();
832
b064a8fa 833 acpi_subsystem_init();
e7ff3a47 834 arch_post_acpi_subsys_init();
6ae6996a 835 sfi_init_late();
1da177e4
LT
836
837 /* Do the rest non-__init'ed, we're now alive */
53c99bd6 838 arch_call_rest_init();
1da177e4
LT
839}
840
b99b87f7
PO
841/* Call all constructor functions linked into the kernel. */
842static void __init do_ctors(void)
843{
844#ifdef CONFIG_CONSTRUCTORS
196a15b4 845 ctor_fn_t *fn = (ctor_fn_t *) __ctors_start;
b99b87f7 846
196a15b4
HS
847 for (; fn < (ctor_fn_t *) __ctors_end; fn++)
848 (*fn)();
b99b87f7
PO
849#endif
850}
851
7b0b73d7
PB
852#ifdef CONFIG_KALLSYMS
853struct blacklist_entry {
854 struct list_head next;
855 char *buf;
856};
857
858static __initdata_or_module LIST_HEAD(blacklisted_initcalls);
859
860static int __init initcall_blacklist(char *str)
861{
862 char *str_entry;
863 struct blacklist_entry *entry;
864
865 /* str argument is a comma-separated list of functions */
866 do {
867 str_entry = strsep(&str, ",");
868 if (str_entry) {
869 pr_debug("blacklisting initcall %s\n", str_entry);
7e1c4e27
MR
870 entry = memblock_alloc(sizeof(*entry),
871 SMP_CACHE_BYTES);
f5c7310a
MR
872 if (!entry)
873 panic("%s: Failed to allocate %zu bytes\n",
874 __func__, sizeof(*entry));
7e1c4e27
MR
875 entry->buf = memblock_alloc(strlen(str_entry) + 1,
876 SMP_CACHE_BYTES);
f5c7310a
MR
877 if (!entry->buf)
878 panic("%s: Failed to allocate %zu bytes\n",
879 __func__, strlen(str_entry) + 1);
7b0b73d7
PB
880 strcpy(entry->buf, str_entry);
881 list_add(&entry->next, &blacklisted_initcalls);
882 }
883 } while (str_entry);
884
885 return 0;
886}
887
888static bool __init_or_module initcall_blacklisted(initcall_t fn)
889{
7b0b73d7 890 struct blacklist_entry *entry;
c8cdd2be 891 char fn_name[KSYM_SYMBOL_LEN];
0fd5ed8d 892 unsigned long addr;
7b0b73d7 893
c8cdd2be 894 if (list_empty(&blacklisted_initcalls))
7b0b73d7
PB
895 return false;
896
0fd5ed8d
RV
897 addr = (unsigned long) dereference_function_descriptor(fn);
898 sprint_symbol_no_offset(fn_name, addr);
c8cdd2be 899
841c06d7
PB
900 /*
901 * fn will be "function_name [module_name]" where [module_name] is not
902 * displayed for built-in init functions. Strip off the [module_name].
903 */
904 strreplace(fn_name, ' ', '\0');
905
e6fd1fb3 906 list_for_each_entry(entry, &blacklisted_initcalls, next) {
7b0b73d7
PB
907 if (!strcmp(fn_name, entry->buf)) {
908 pr_debug("initcall %s blacklisted\n", fn_name);
7b0b73d7
PB
909 return true;
910 }
911 }
912
7b0b73d7
PB
913 return false;
914}
915#else
916static int __init initcall_blacklist(char *str)
917{
918 pr_warn("initcall_blacklist requires CONFIG_KALLSYMS\n");
919 return 0;
920}
921
922static bool __init_or_module initcall_blacklisted(initcall_t fn)
923{
924 return false;
925}
926#endif
927__setup("initcall_blacklist=", initcall_blacklist);
928
4e37958d
SRV
929static __init_or_module void
930trace_initcall_start_cb(void *data, initcall_t fn)
1da177e4 931{
4e37958d 932 ktime_t *calltime = (ktime_t *)data;
1da177e4 933
d75f773c 934 printk(KERN_DEBUG "calling %pS @ %i\n", fn, task_pid_nr(current));
4e37958d
SRV
935 *calltime = ktime_get();
936}
937
938static __init_or_module void
939trace_initcall_finish_cb(void *data, initcall_t fn, int ret)
940{
941 ktime_t *calltime = (ktime_t *)data;
942 ktime_t delta, rettime;
943 unsigned long long duration;
944
22c5c03b 945 rettime = ktime_get();
4e37958d 946 delta = ktime_sub(rettime, *calltime);
22c5c03b 947 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
d75f773c 948 printk(KERN_DEBUG "initcall %pS returned %d after %lld usecs\n",
ea676e84 949 fn, ret, duration);
4e37958d 950}
1da177e4 951
4e37958d
SRV
952static ktime_t initcall_calltime;
953
b0dc52f1 954#ifdef TRACEPOINTS_ENABLED
4e37958d
SRV
955static void __init initcall_debug_enable(void)
956{
957 int ret;
958
959 ret = register_trace_initcall_start(trace_initcall_start_cb,
960 &initcall_calltime);
961 ret |= register_trace_initcall_finish(trace_initcall_finish_cb,
962 &initcall_calltime);
963 WARN(ret, "Failed to register initcall tracepoints\n");
22c5c03b 964}
b0dc52f1
SRV
965# define do_trace_initcall_start trace_initcall_start
966# define do_trace_initcall_finish trace_initcall_finish
967#else
968static inline void do_trace_initcall_start(initcall_t fn)
969{
970 if (!initcall_debug)
971 return;
972 trace_initcall_start_cb(&initcall_calltime, fn);
973}
974static inline void do_trace_initcall_finish(initcall_t fn, int ret)
975{
976 if (!initcall_debug)
977 return;
978 trace_initcall_finish_cb(&initcall_calltime, fn, ret);
979}
980#endif /* !TRACEPOINTS_ENABLED */
22c5c03b 981
e4461271 982int __init_or_module do_one_initcall(initcall_t fn)
22c5c03b
KW
983{
984 int count = preempt_count();
ff1c8fac 985 char msgbuf[64];
4e37958d 986 int ret;
22c5c03b 987
7b0b73d7
PB
988 if (initcall_blacklisted(fn))
989 return -EPERM;
990
b0dc52f1 991 do_trace_initcall_start(fn);
4e37958d 992 ret = fn();
b0dc52f1 993 do_trace_initcall_finish(fn, ret);
8f0c45cd 994
e0df154f 995 msgbuf[0] = 0;
e662e1cf 996
e0df154f 997 if (preempt_count() != count) {
bf5d770b 998 sprintf(msgbuf, "preemption imbalance ");
4a2b4b22 999 preempt_count_set(count);
1da177e4 1000 }
e0df154f 1001 if (irqs_disabled()) {
a76bfd0d 1002 strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
e0df154f
LT
1003 local_irq_enable();
1004 }
d75f773c 1005 WARN(msgbuf[0], "initcall %pS returned with %s\n", fn, msgbuf);
59f9415f 1006
38addce8 1007 add_latent_entropy();
30dbb20e 1008 return ret;
e0df154f
LT
1009}
1010
1011
1b1eeca7
AB
1012extern initcall_entry_t __initcall_start[];
1013extern initcall_entry_t __initcall0_start[];
1014extern initcall_entry_t __initcall1_start[];
1015extern initcall_entry_t __initcall2_start[];
1016extern initcall_entry_t __initcall3_start[];
1017extern initcall_entry_t __initcall4_start[];
1018extern initcall_entry_t __initcall5_start[];
1019extern initcall_entry_t __initcall6_start[];
1020extern initcall_entry_t __initcall7_start[];
1021extern initcall_entry_t __initcall_end[];
1022
1023static initcall_entry_t *initcall_levels[] __initdata = {
026cee00
PM
1024 __initcall0_start,
1025 __initcall1_start,
1026 __initcall2_start,
1027 __initcall3_start,
1028 __initcall4_start,
1029 __initcall5_start,
1030 __initcall6_start,
1031 __initcall7_start,
1032 __initcall_end,
1033};
1034
96263d28 1035/* Keep these in sync with initcalls in include/linux/init.h */
7c8f7193 1036static const char *initcall_level_names[] __initdata = {
a6fb6012 1037 "pure",
9fb48c74
JC
1038 "core",
1039 "postcore",
1040 "arch",
1041 "subsys",
1042 "fs",
1043 "device",
1044 "late",
026cee00
PM
1045};
1046
026cee00 1047static void __init do_initcall_level(int level)
e0df154f 1048{
1b1eeca7 1049 initcall_entry_t *fn;
e0df154f 1050
08746a65 1051 strcpy(initcall_command_line, saved_command_line);
026cee00 1052 parse_args(initcall_level_names[level],
08746a65 1053 initcall_command_line, __start___param,
026cee00
PM
1054 __stop___param - __start___param,
1055 level, level,
ecc86170 1056 NULL, &repair_env_string);
026cee00 1057
4ee7c60d 1058 trace_initcall_level(initcall_level_names[level]);
026cee00 1059 for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
1b1eeca7 1060 do_one_initcall(initcall_from_entry(fn));
1da177e4
LT
1061}
1062
026cee00
PM
1063static void __init do_initcalls(void)
1064{
1065 int level;
1066
19efb72f 1067 for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++)
026cee00
PM
1068 do_initcall_level(level);
1069}
1070
1da177e4
LT
1071/*
1072 * Ok, the machine is now initialized. None of the devices
1073 * have been touched yet, but the CPU subsystem is up and
1074 * running, and memory and process management works.
1075 *
1076 * Now we can finally start doing some real work..
1077 */
1078static void __init do_basic_setup(void)
1079{
759ee091 1080 cpuset_init_smp();
1da177e4 1081 driver_init();
b04c3afb 1082 init_irq_proc();
b99b87f7 1083 do_ctors();
d5767c53 1084 usermodehelper_enable();
b0f84374 1085 do_initcalls();
1da177e4
LT
1086}
1087
7babe8db 1088static void __init do_pre_smp_initcalls(void)
c2147a50 1089{
1b1eeca7 1090 initcall_entry_t *fn;
c2147a50 1091
4ee7c60d 1092 trace_initcall_level("early");
026cee00 1093 for (fn = __initcall_start; fn < __initcall0_start; fn++)
1b1eeca7 1094 do_one_initcall(initcall_from_entry(fn));
c2147a50
EGM
1095}
1096
a74fb73c 1097static int run_init_process(const char *init_filename)
1da177e4
LT
1098{
1099 argv_init[0] = init_filename;
3f5c15d8 1100 pr_info("Run %s as init process\n", init_filename);
c4ad8f98 1101 return do_execve(getname_kernel(init_filename),
ae903caa
AV
1102 (const char __user *const __user *)argv_init,
1103 (const char __user *const __user *)envp_init);
1da177e4
LT
1104}
1105
ba24762b
MO
1106static int try_to_run_init_process(const char *init_filename)
1107{
1108 int ret;
1109
1110 ret = run_init_process(init_filename);
1111
1112 if (ret && ret != -ENOENT) {
1113 pr_err("Starting init: %s exists but couldn't execute it (error %d)\n",
1114 init_filename, ret);
1115 }
1116
1117 return ret;
1118}
1119
f80b0c90 1120static noinline void __init kernel_init_freeable(void);
d6b21238 1121
0f5bf6d0 1122#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
39290b38 1123bool rodata_enabled __ro_after_init = true;
d2aa1aca
KC
1124static int __init set_debug_rodata(char *str)
1125{
1126 return strtobool(str, &rodata_enabled);
1127}
1128__setup("rodata=", set_debug_rodata);
39290b38 1129#endif
d2aa1aca 1130
0f5bf6d0 1131#ifdef CONFIG_STRICT_KERNEL_RWX
d2aa1aca
KC
1132static void mark_readonly(void)
1133{
2959a5f7 1134 if (rodata_enabled) {
ae646f0b 1135 /*
ba180314
PM
1136 * load_module() results in W+X mappings, which are cleaned
1137 * up with call_rcu(). Let's make sure that queued work is
ae646f0b
JH
1138 * flushed so that we don't hit false positives looking for
1139 * insecure pages which are W+X.
1140 */
ba180314 1141 rcu_barrier();
d2aa1aca 1142 mark_rodata_ro();
2959a5f7
JP
1143 rodata_test();
1144 } else
d2aa1aca
KC
1145 pr_info("Kernel memory protection disabled.\n");
1146}
1147#else
1148static inline void mark_readonly(void)
1149{
1150 pr_warn("This architecture does not have kernel memory protection.\n");
1151}
1152#endif
1153
997aef68
MR
1154void __weak free_initmem(void)
1155{
f4039999 1156 free_initmem_default(POISON_FREE_INITMEM);
997aef68
MR
1157}
1158
d6b21238 1159static int __ref kernel_init(void *unused)
ee5bfa64 1160{
ba24762b
MO
1161 int ret;
1162
d6b21238 1163 kernel_init_freeable();
22a9d645
AV
1164 /* need to finish all async __init code before freeing the memory */
1165 async_synchronize_full();
b80f0f6c 1166 ftrace_free_init_mem();
ee5bfa64 1167 free_initmem();
d2aa1aca 1168 mark_readonly();
b976690f
JR
1169
1170 /*
1171 * Kernel mappings are now finalized - update the userspace page-table
1172 * to finalize PTI.
1173 */
1174 pti_finalize();
1175
ee5bfa64
VG
1176 system_state = SYSTEM_RUNNING;
1177 numa_default_policy();
1178
967dcb8f
PM
1179 rcu_end_inkernel_boot();
1180
ee5bfa64 1181 if (ramdisk_execute_command) {
ba24762b
MO
1182 ret = run_init_process(ramdisk_execute_command);
1183 if (!ret)
a74fb73c 1184 return 0;
ba24762b
MO
1185 pr_err("Failed to execute %s (error %d)\n",
1186 ramdisk_execute_command, ret);
ee5bfa64
VG
1187 }
1188
1189 /*
1190 * We try each of these until one succeeds.
1191 *
1192 * The Bourne shell can be used instead of init if we are
1193 * trying to recover a really broken machine.
1194 */
1195 if (execute_command) {
ba24762b
MO
1196 ret = run_init_process(execute_command);
1197 if (!ret)
a74fb73c 1198 return 0;
6ef4536e
AL
1199 panic("Requested init %s failed (error %d).",
1200 execute_command, ret);
ee5bfa64 1201 }
ba24762b
MO
1202 if (!try_to_run_init_process("/sbin/init") ||
1203 !try_to_run_init_process("/etc/init") ||
1204 !try_to_run_init_process("/bin/init") ||
1205 !try_to_run_init_process("/bin/sh"))
a74fb73c 1206 return 0;
ee5bfa64 1207
ba24762b 1208 panic("No working init found. Try passing init= option to kernel. "
8c27ceff 1209 "See Linux Documentation/admin-guide/init.rst for guidance.");
ee5bfa64
VG
1210}
1211
b49a733d
DB
1212void console_on_rootfs(void)
1213{
74f1a299
DB
1214 /* Open the /dev/console as stdin, this should never fail */
1215 if (ksys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
1216 pr_err("Warning: unable to open an initial console.\n");
b49a733d 1217
74f1a299
DB
1218 /* create stdout/stderr */
1219 (void) ksys_dup(0);
1220 (void) ksys_dup(0);
b49a733d
DB
1221}
1222
f80b0c90 1223static noinline void __init kernel_init_freeable(void)
1da177e4 1224{
b433c3d4
PZ
1225 /*
1226 * Wait until kthreadd is all set-up.
1227 */
1228 wait_for_completion(&kthreadd_done);
31a67102
LT
1229
1230 /* Now the scheduler is fully set up and can do blocking allocations */
1231 gfp_allowed_mask = __GFP_BITS_MASK;
1232
58568d2a
MX
1233 /*
1234 * init can allocate pages on any node
1235 */
3c466d46 1236 set_mems_allowed(node_states[N_MEMORY]);
1da177e4 1237
9ec52099
CLG
1238 cad_pid = task_pid(current);
1239
ca74a6f8 1240 smp_prepare_cpus(setup_max_cpus);
1da177e4 1241
3347fa09
TH
1242 workqueue_init();
1243
597b7305
MH
1244 init_mm_internals();
1245
1da177e4 1246 do_pre_smp_initcalls();
004417a6 1247 lockup_detector_init();
1da177e4 1248
1da177e4
LT
1249 smp_init();
1250 sched_init_smp();
1251
0e1cc95b 1252 page_alloc_init_late();
2f1ee091
QC
1253 /* Initialize page ext after all struct pages are initialized. */
1254 page_ext_init();
0e1cc95b 1255
1da177e4
LT
1256 do_basic_setup();
1257
b49a733d 1258 console_on_rootfs();
2bd3a997 1259
1da177e4
LT
1260 /*
1261 * check if there is an early userspace init. If yes, let it do all
1262 * the work
1263 */
ffdfc409
OJ
1264
1265 if (!ramdisk_execute_command)
1266 ramdisk_execute_command = "/init";
1267
cbfe20f5
DB
1268 if (ksys_access((const char __user *)
1269 ramdisk_execute_command, 0) != 0) {
ffdfc409 1270 ramdisk_execute_command = NULL;
1da177e4 1271 prepare_namespace();
ffdfc409 1272 }
1da177e4
LT
1273
1274 /*
1275 * Ok, we have completed the initial bootup, and
1276 * we're essentially up and running. Get rid of the
1277 * initmem segments and start the user-mode stuff..
c9cd2ce2
DK
1278 *
1279 * rootfs is available now, try loading the public keys
1280 * and default modules
1da177e4 1281 */
bb813f4c 1282
c9cd2ce2 1283 integrity_load_keys();
1da177e4 1284}