Blame view

init/main.c 30.2 KB
457c89965   Thomas Gleixner   treewide: Add SPD...
1
  // SPDX-License-Identifier: GPL-2.0-only
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
7
8
9
  /*
   *  linux/init/main.c
   *
   *  Copyright (C) 1991, 1992  Linus Torvalds
   *
   *  GK 2/5/95  -  Changed to support mounting root fs via NFS
   *  Added initrd & change_root: Werner Almesberger & Hans Lermen, Feb '96
   *  Moan early if gcc is old, avoiding bogus kernels - Paul Gortmaker, May '96
dd4d9fecb   Fabian Frederick   init/main.c: code...
10
   *  Simplified starting of init:  Michael A. Griffith <grif@acm.org>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
11
   */
ea676e846   Andrew Morton   init/main.c: conv...
12
  #define DEBUG		/* Enable initcall_debug */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
  #include <linux/types.h>
8a293be0d   Paul Gortmaker   core: migrate exc...
14
  #include <linux/extable.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
  #include <linux/module.h>
  #include <linux/proc_fs.h>
5c2c5c551   Ingo Molnar   sched/headers, vf...
17
  #include <linux/binfmts.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
  #include <linux/kernel.h>
  #include <linux/syscalls.h>
9b5609fd7   Ingo Molnar   stackprotector: i...
20
  #include <linux/stackprotector.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
  #include <linux/string.h>
  #include <linux/ctype.h>
  #include <linux/delay.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
  #include <linux/ioport.h>
  #include <linux/init.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
  #include <linux/initrd.h>
57c8a661d   Mike Rapoport   mm: remove includ...
27
  #include <linux/memblock.h>
4a7a16dc0   Len Brown   ACPI: move declar...
28
  #include <linux/acpi.h>
0c688614d   Nicolas Pitre   console: move con...
29
  #include <linux/console.h>
38b8d208a   Ingo Molnar   sched/headers: Pr...
30
  #include <linux/nmi.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
  #include <linux/percpu.h>
  #include <linux/kmod.h>
c4ab0a837   Masami Hiramatsu   kprobes: tracing/...
33
  #include <linux/kprobes.h>
db64fe022   Nick Piggin   mm: rewrite vmap ...
34
  #include <linux/vmalloc.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
  #include <linux/kernel_stat.h>
d7cd56111   Rusty Russell   [PATCH] i386: cpu...
36
  #include <linux/start_kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
  #include <linux/security.h>
3d4422332   Jens Axboe   Add generic helpe...
38
  #include <linux/smp.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
41
42
43
44
45
  #include <linux/profile.h>
  #include <linux/rcupdate.h>
  #include <linux/moduleparam.h>
  #include <linux/kallsyms.h>
  #include <linux/writeback.h>
  #include <linux/cpu.h>
  #include <linux/cpuset.h>
ddbcc7e8e   Paul Menage   Task Control Grou...
46
  #include <linux/cgroup.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  #include <linux/efi.h>
906568c9c   Thomas Gleixner   [PATCH] tick-mana...
48
  #include <linux/tick.h>
786340614   Frederic Weisbecker   sched/isolation: ...
49
  #include <linux/sched/isolation.h>
6168a702a   Andrew Morton   [PATCH] Declare i...
50
  #include <linux/interrupt.h>
c757249af   Shailabh Nagar   [PATCH] per-task-...
51
  #include <linux/taskstats_kern.h>
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
52
  #include <linux/delayacct.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
  #include <linux/unistd.h>
3ea056c50   Alexey Dobriyan   uts: create "stru...
54
  #include <linux/utsname.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
57
  #include <linux/rmap.h>
  #include <linux/mempolicy.h>
  #include <linux/key.h>
b6cd0b772   Adrian Bunk   [PATCH] fs/buffer...
58
  #include <linux/buffer_head.h>
eefa864b7   Joonsoo Kim   mm/page_ext: resu...
59
  #include <linux/page_ext.h>
9a11b49a8   Ingo Molnar   [PATCH] lockdep: ...
60
  #include <linux/debug_locks.h>
3ac7fe5a4   Thomas Gleixner   infrastructure to...
61
  #include <linux/debugobjects.h>
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
62
  #include <linux/lockdep.h>
3c7b4e6b8   Catalin Marinas   kmemleak: Add the...
63
  #include <linux/kmemleak.h>
84d737866   Sukadev Bhattiprolu   [PATCH] add child...
64
  #include <linux/pid_namespace.h>
1f21782e6   Adrian Bunk   Driver core: prop...
65
  #include <linux/device.h>
73c279927   Eric W. Biederman   kthread: don't de...
66
  #include <linux/kthread.h>
e6fe6649b   Adrian Bunk   sched: proper pro...
67
  #include <linux/sched.h>
1777e4635   Ingo Molnar   sched/headers: Pr...
68
  #include <linux/sched/init.h>
a1c9eea9e   Adrian Bunk   proper prototype ...
69
  #include <linux/signal.h>
199f0ca51   Akinobu Mita   idr: create idr_l...
70
  #include <linux/idr.h>
0b4b3827d   Jason Wessel   x86, kgdb, init: ...
71
  #include <linux/kgdb.h>
68bf21aa1   Steven Rostedt   ftrace: mcount ca...
72
  #include <linux/ftrace.h>
22a9d6456   Arjan van de Ven   async: Asynchrono...
73
  #include <linux/async.h>
6ae6996a4   Feng Tang   SFI: add platform...
74
  #include <linux/sfi.h>
2b2af54a5   Kay Sievers   Driver Core: devt...
75
  #include <linux/shmem_fs.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
76
  #include <linux/slab.h>
24a24bb6f   Peter Zijlstra   perf: Move perf_e...
77
  #include <linux/perf_event.h>
a74fb73c1   Al Viro   infrastructure fo...
78
  #include <linux/ptrace.h>
aa8c6248f   Thomas Gleixner   x86/mm/pti: Add i...
79
  #include <linux/pti.h>
bb813f4c9   Tejun Heo   init, block: try ...
80
81
  #include <linux/blkdev.h>
  #include <linux/elevator.h>
5d2a4e91a   Pavel Tatashin   sched/clock: Move...
82
  #include <linux/sched/clock.h>
299300258   Ingo Molnar   sched/headers: Pr...
83
  #include <linux/sched/task.h>
68db0cf10   Ingo Molnar   sched/headers: Pr...
84
  #include <linux/sched/task_stack.h>
65f382fd0   Frederic Weisbecker   context_tracking:...
85
  #include <linux/context_tracking.h>
47d06e532   Theodore Ts'o   random: run rando...
86
  #include <linux/random.h>
7b0b73d76   Prarit Bhargava   init/main.c: add ...
87
  #include <linux/list.h>
c9cd2ce2b   Dmitry Kasatkin   integrity: provid...
88
  #include <linux/integrity.h>
e149ed2b8   Al Viro   take the targets ...
89
  #include <linux/proc_ns.h>
0ddab1d2e   Toshi Kani   lib/ioremap.c: ad...
90
  #include <linux/io.h>
39290b389   AKASHI Takahiro   module: extend 'r...
91
  #include <linux/cache.h>
2959a5f72   Jinbum Park   mm: add arch-inde...
92
  #include <linux/rodata_test.h>
333522447   Josh Poimboeuf   jump_label: Expli...
93
  #include <linux/jump_label.h>
ae67d58d0   Mathieu Malaterre   init/main.c: incl...
94
  #include <linux/mem_encrypt.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
96
97
98
  
  #include <asm/io.h>
  #include <asm/bugs.h>
  #include <asm/setup.h>
a940199f2   Andi Kleen   [PATCH] x86_64: S...
99
  #include <asm/sections.h>
37b73c828   Arjan van de Ven   [PATCH] x86/x86_6...
100
  #include <asm/cacheflush.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101

4ee7c60de   Steven Rostedt (VMware)   init, tracing: Ad...
102
103
  #define CREATE_TRACE_POINTS
  #include <trace/events/initcall.h>
aae5f662a   Sam Ravnborg   kbuild: whitelist...
104
  static int kernel_init(void *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
106
  
  extern void init_IRQ(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
  extern void radix_tree_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108

2ce802f62   Tejun Heo   lockdep: Move ear...
109
110
111
112
113
114
115
116
  /*
   * Debug helper: via this flag we know that we are in 'early bootup code'
   * where only the boot processor is running with IRQ disabled.  This means
   * two things - IRQ must not be enabled before the flag is cleared and some
   * operations which are not allowed with IRQ disabled are allowed while the
   * flag is set.
   */
  bool early_boot_irqs_disabled __read_mostly;
a68260483   Paul E. McKenney   rcu: Teach RCU th...
117
  enum system_states system_state __read_mostly;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
119
120
121
122
123
124
125
126
127
  EXPORT_SYMBOL(system_state);
  
  /*
   * Boot command-line arguments
   */
  #define MAX_INIT_ARGS CONFIG_INIT_ENV_ARG_LIMIT
  #define MAX_INIT_ENVS CONFIG_INIT_ENV_ARG_LIMIT
  
  extern void time_init(void);
  /* Default late time init is NULL. archs can override this later. */
d2e3192b6   Jan Beulich   init/main.c: mark...
128
  void (*__initdata late_time_init)(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129

30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
130
131
132
133
134
135
  /* Untouched command line saved by arch-specific code. */
  char __initdata boot_command_line[COMMAND_LINE_SIZE];
  /* Untouched saved command line (eg. for /proc) */
  char *saved_command_line;
  /* Command line for parameter parsing */
  static char *static_command_line;
08746a65c   Krzysztof Mazur   init: fix in-plac...
136
137
  /* Command line for per-initcall parameter parsing */
  static char *initcall_command_line;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
139
  
  static char *execute_command;
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
140
  static char *ramdisk_execute_command;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141

8b3b29550   Jan Beulich   adjust nosmp hand...
142
  /*
c4b2c0c5f   Hannes Frederic Sowa   static_key: WARN ...
143
144
145
   * Used to generate warnings if static_key manipulation functions are used
   * before jump_label_init is called.
   */
dd4d9fecb   Fabian Frederick   init/main.c: code...
146
  bool static_key_initialized __read_mostly;
c4b2c0c5f   Hannes Frederic Sowa   static_key: WARN ...
147
148
149
  EXPORT_SYMBOL_GPL(static_key_initialized);
  
  /*
8b3b29550   Jan Beulich   adjust nosmp hand...
150
151
152
153
154
   * If set, this is an indication to the drivers that reset the underlying
   * device before going ahead with the initialization otherwise driver might
   * rely on the BIOS and skip the reset operation.
   *
   * This is useful if kernel is booting in an unreliable environment.
fc454fdc1   Frans Klaver   init/main: fix re...
155
   * For ex. kdump situation where previous kernel has crashed, BIOS has been
8b3b29550   Jan Beulich   adjust nosmp hand...
156
157
158
159
   * skipped and devices will be in unknown state.
   */
  unsigned int reset_devices;
  EXPORT_SYMBOL(reset_devices);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160

7e96287dd   Vivek Goyal   [PATCH] kdump: in...
161
162
163
164
165
166
167
  static int __init set_reset_devices(char *str)
  {
  	reset_devices = 1;
  	return 1;
  }
  
  __setup("reset_devices", set_reset_devices);
dd4d9fecb   Fabian Frederick   init/main.c: code...
168
169
  static const char *argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
  const char *envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
  static const char *panic_later, *panic_param;
914dcaa84   Rusty Russell   param: make param...
171
  extern const struct obs_kernel_param __setup_start[], __setup_end[];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
172

31c025b5f   Yaowei Bai   init/main.c: obso...
173
  static bool __init obsolete_checksetup(char *line)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
  {
914dcaa84   Rusty Russell   param: make param...
175
  	const struct obs_kernel_param *p;
31c025b5f   Yaowei Bai   init/main.c: obso...
176
  	bool had_early_param = false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
178
179
180
  
  	p = __setup_start;
  	do {
  		int n = strlen(p->str);
b1e4d20cb   Michal Schmidt   params: make dash...
181
  		if (parameqn(line, p->str, n)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
  			if (p->early) {
33df0d19e   Rusty Russell   [PATCH] Allow ear...
183
184
185
186
  				/* Already done in parse_early_param?
  				 * (Needs exact match on param part).
  				 * Keep iterating, as we can have early
  				 * params and __setups of same names 8( */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
  				if (line[n] == '\0' || line[n] == '=')
31c025b5f   Yaowei Bai   init/main.c: obso...
188
  					had_early_param = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
  			} else if (!p->setup_func) {
ea676e846   Andrew Morton   init/main.c: conv...
190
191
192
  				pr_warn("Parameter %s is obsolete, ignored
  ",
  					p->str);
31c025b5f   Yaowei Bai   init/main.c: obso...
193
  				return true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
  			} else if (p->setup_func(line + n))
31c025b5f   Yaowei Bai   init/main.c: obso...
195
  				return true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196
197
198
  		}
  		p++;
  	} while (p < __setup_end);
33df0d19e   Rusty Russell   [PATCH] Allow ear...
199
200
  
  	return had_early_param;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
202
203
204
205
206
207
  }
  
  /*
   * This should be approx 2 Bo*oMips to start (note initial shift), and will
   * still work even if initially too large, it will just take slightly longer
   */
  unsigned long loops_per_jiffy = (1<<12);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
209
210
211
  EXPORT_SYMBOL(loops_per_jiffy);
  
  static int __init debug_kernel(char *str)
  {
a8fe19ebf   Borislav Petkov   kernel/printk: us...
212
  	console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
f6f21c814   Yinghai Lu   Convert loglevel-...
213
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
214
215
216
217
  }
  
  static int __init quiet_kernel(char *str)
  {
a8fe19ebf   Borislav Petkov   kernel/printk: us...
218
  	console_loglevel = CONSOLE_LOGLEVEL_QUIET;
f6f21c814   Yinghai Lu   Convert loglevel-...
219
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
220
  }
f6f21c814   Yinghai Lu   Convert loglevel-...
221
222
  early_param("debug", debug_kernel);
  early_param("quiet", quiet_kernel);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
223
224
225
  
  static int __init loglevel(char *str)
  {
808bf29b9   Alexander Sverdlin   init: carefully h...
226
227
228
229
230
231
232
233
234
235
236
237
238
  	int newlevel;
  
  	/*
  	 * Only update loglevel value when a correct setting was passed,
  	 * to prevent blind crashes (when loglevel being set to 0) that
  	 * are quite hard to debug
  	 */
  	if (get_option(&str, &newlevel)) {
  		console_loglevel = newlevel;
  		return 0;
  	}
  
  	return -EINVAL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239
  }
f6f21c814   Yinghai Lu   Convert loglevel-...
240
  early_param("loglevel", loglevel);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
241

a99cd1125   Chris Metcalf   init: fix bug whe...
242
  /* Change NUL term back to "=", to make "param" the whole string. */
ecc861705   Luis R. Rodriguez   module: add extra...
243
244
  static int __init repair_env_string(char *param, char *val,
  				    const char *unused, void *arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
247
248
249
250
251
252
253
254
255
256
  	if (val) {
  		/* param=val or param="val"? */
  		if (val == param+strlen(param)+1)
  			val[-1] = '=';
  		else if (val == param+strlen(param)+2) {
  			val[-2] = '=';
  			memmove(val-1, val, strlen(val)+1);
  			val--;
  		} else
  			BUG();
  	}
a99cd1125   Chris Metcalf   init: fix bug whe...
257
258
  	return 0;
  }
51e158c12   Rusty Russell   param: hand argum...
259
  /* Anything after -- gets handed straight to init. */
ecc861705   Luis R. Rodriguez   module: add extra...
260
261
  static int __init set_init_arg(char *param, char *val,
  			       const char *unused, void *arg)
51e158c12   Rusty Russell   param: hand argum...
262
263
264
265
266
  {
  	unsigned int i;
  
  	if (panic_later)
  		return 0;
ecc861705   Luis R. Rodriguez   module: add extra...
267
  	repair_env_string(param, val, unused, NULL);
51e158c12   Rusty Russell   param: hand argum...
268
269
270
271
272
273
274
275
276
277
278
  
  	for (i = 0; argv_init[i]; i++) {
  		if (i == MAX_INIT_ARGS) {
  			panic_later = "init";
  			panic_param = param;
  			return 0;
  		}
  	}
  	argv_init[i] = param;
  	return 0;
  }
a99cd1125   Chris Metcalf   init: fix bug whe...
279
280
281
282
  /*
   * Unknown boot options get handed to init, unless they look like
   * unused parameters (modprobe will find them in /proc/cmdline).
   */
ecc861705   Luis R. Rodriguez   module: add extra...
283
284
  static int __init unknown_bootoption(char *param, char *val,
  				     const char *unused, void *arg)
a99cd1125   Chris Metcalf   init: fix bug whe...
285
  {
ecc861705   Luis R. Rodriguez   module: add extra...
286
  	repair_env_string(param, val, unused, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
287
288
289
290
  
  	/* Handle obsolete-style parameters */
  	if (obsolete_checksetup(param))
  		return 0;
f066a4f6d   Rusty Russell   param: don't comp...
291
292
  	/* Unused module parameter. */
  	if (strchr(param, '.') && (!val || strchr(param, '.') < val))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
295
296
297
298
299
300
301
302
  
  	if (panic_later)
  		return 0;
  
  	if (val) {
  		/* Environment option */
  		unsigned int i;
  		for (i = 0; envp_init[i]; i++) {
  			if (i == MAX_INIT_ENVS) {
499a4584d   Tetsuo Handa   init: fix possibl...
303
  				panic_later = "env";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
304
305
306
307
308
309
310
311
312
313
314
  				panic_param = param;
  			}
  			if (!strncmp(param, envp_init[i], val - param))
  				break;
  		}
  		envp_init[i] = param;
  	} else {
  		/* Command line option */
  		unsigned int i;
  		for (i = 0; argv_init[i]; i++) {
  			if (i == MAX_INIT_ARGS) {
499a4584d   Tetsuo Handa   init: fix possibl...
315
  				panic_later = "init";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
  				panic_param = param;
  			}
  		}
  		argv_init[i] = param;
  	}
  	return 0;
  }
  
  static int __init init_setup(char *str)
  {
  	unsigned int i;
  
  	execute_command = str;
  	/*
  	 * In case LILO is going to boot us with default command line,
  	 * it prepends "auto" before the whole cmdline which makes
  	 * the shell think it should execute a script with such name.
  	 * So we ignore all arguments entered _before_ init=... [MJ]
  	 */
  	for (i = 1; i < MAX_INIT_ARGS; i++)
  		argv_init[i] = NULL;
  	return 1;
  }
  __setup("init=", init_setup);
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
340
341
342
343
344
345
346
347
348
349
350
  static int __init rdinit_setup(char *str)
  {
  	unsigned int i;
  
  	ramdisk_execute_command = str;
  	/* See "auto" comment in init_setup */
  	for (i = 1; i < MAX_INIT_ARGS; i++)
  		argv_init[i] = NULL;
  	return 1;
  }
  __setup("rdinit=", rdinit_setup);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
351
  #ifndef CONFIG_SMP
34db18a05   Amerigo Wang   smp: move smp set...
352
  static const unsigned int setup_max_cpus = NR_CPUS;
e0982e90c   Mike Travis   init: move setup ...
353
  static inline void setup_nr_cpu_ids(void) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
354
  static inline void smp_prepare_cpus(unsigned int maxcpus) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
355
356
357
  #endif
  
  /*
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
358
359
360
361
362
363
364
   * We need to store the untouched command line for future reference.
   * We also need to store the touched command line since the parameter
   * parsing is performed in place, and we should allow a component to
   * store reference of name/value for future reference.
   */
  static void __init setup_command_line(char *command_line)
  {
f5c7310ac   Mike Rapoport   init/main: add ch...
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
  	size_t len = strlen(boot_command_line) + 1;
  
  	saved_command_line = memblock_alloc(len, SMP_CACHE_BYTES);
  	if (!saved_command_line)
  		panic("%s: Failed to allocate %zu bytes
  ", __func__, len);
  
  	initcall_command_line =	memblock_alloc(len, SMP_CACHE_BYTES);
  	if (!initcall_command_line)
  		panic("%s: Failed to allocate %zu bytes
  ", __func__, len);
  
  	static_command_line = memblock_alloc(len, SMP_CACHE_BYTES);
  	if (!static_command_line)
  		panic("%s: Failed to allocate %zu bytes
  ", __func__, len);
dd4d9fecb   Fabian Frederick   init/main.c: code...
381
382
  	strcpy(saved_command_line, boot_command_line);
  	strcpy(static_command_line, command_line);
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
383
384
385
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
386
387
388
389
390
391
392
   * We need to finalize in a non-__init function or else race conditions
   * between the root thread and the init thread may cause start_kernel to
   * be reaped by free_initmem before the root thread has proceeded to
   * cpu_idle.
   *
   * gcc-3.4 accidentally inlines this function, so use noinline.
   */
b433c3d45   Peter Zijlstra   init, sched: Fix ...
393
  static __initdata DECLARE_COMPLETION(kthreadd_done);
53c99bd66   Martin Schwidefsky   init: add arch_ca...
394
  noinline void __ref rest_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
395
  {
8fb12156b   Thomas Gleixner   init: Pin init ta...
396
  	struct task_struct *tsk;
73c279927   Eric W. Biederman   kthread: don't de...
397
  	int pid;
7db905e63   Paul E. McKenney   rcu: Move end of ...
398
  	rcu_scheduler_starting();
b433c3d45   Peter Zijlstra   init, sched: Fix ...
399
  	/*
971585692   Peter Zijlstra   init: Fix comment
400
  	 * We need to spawn init first so that it obtains pid 1, however
b433c3d45   Peter Zijlstra   init, sched: Fix ...
401
402
403
  	 * the init task will end up wanting to create kthreads, which, if
  	 * we schedule it before we create kthreadd, will OOPS.
  	 */
8fb12156b   Thomas Gleixner   init: Pin init ta...
404
405
406
407
408
409
410
411
412
413
  	pid = kernel_thread(kernel_init, NULL, CLONE_FS);
  	/*
  	 * Pin init on the boot CPU. Task migration is not properly working
  	 * until sched_init_smp() has been run. It will set the allowed
  	 * CPUs for init to the non isolated CPUs.
  	 */
  	rcu_read_lock();
  	tsk = find_task_by_pid_ns(pid, &init_pid_ns);
  	set_cpus_allowed_ptr(tsk, cpumask_of(smp_processor_id()));
  	rcu_read_unlock();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414
  	numa_default_policy();
73c279927   Eric W. Biederman   kthread: don't de...
415
  	pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
d11c563dd   Paul E. McKenney   sched: Use lockde...
416
  	rcu_read_lock();
5cd204550   Pavel Emelyanov   Deprecate find_ta...
417
  	kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
d11c563dd   Paul E. McKenney   sched: Use lockde...
418
  	rcu_read_unlock();
1c3c5eab1   Thomas Gleixner   sched/core: Enabl...
419
420
421
  
  	/*
  	 * Enable might_sleep() and smp_processor_id() checks.
c1a280b68   Thomas Gleixner   sched/preempt: Us...
422
  	 * They cannot be enabled earlier because with CONFIG_PREEMPTION=y
1c3c5eab1   Thomas Gleixner   sched/core: Enabl...
423
424
425
426
427
  	 * kernel_thread() would trigger might_sleep() splats. With
  	 * CONFIG_PREEMPT_VOLUNTARY=y the init task might have scheduled
  	 * already, but it's stuck on the kthreadd_done completion.
  	 */
  	system_state = SYSTEM_SCHEDULING;
b433c3d45   Peter Zijlstra   init, sched: Fix ...
428
  	complete(&kthreadd_done);
f340c0d1a   Ingo Molnar   [PATCH] Tweak idl...
429
430
431
  
  	/*
  	 * The boot idle thread must execute schedule()
1df21055e   Ingo Molnar   sched: add init_i...
432
  	 * at least once to get things moving:
f340c0d1a   Ingo Molnar   [PATCH] Tweak idl...
433
  	 */
bd2f55361   Thomas Gleixner   sched/rt: Use sch...
434
  	schedule_preempt_disabled();
5bfb5d690   Nick Piggin   [PATCH] sched: di...
435
  	/* Call into cpu_idle with preempt disabled */
a1a04ec3c   Thomas Gleixner   idle: Provide a g...
436
  	cpu_startup_entry(CPUHP_ONLINE);
1df21055e   Ingo Molnar   sched: add init_i...
437
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
439
  
  /* Check for early params. */
ecc861705   Luis R. Rodriguez   module: add extra...
440
441
  static int __init do_early_param(char *param, char *val,
  				 const char *unused, void *arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
442
  {
914dcaa84   Rusty Russell   param: make param...
443
  	const struct obs_kernel_param *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
444
445
  
  	for (p = __setup_start; p < __setup_end; p++) {
b1e4d20cb   Michal Schmidt   params: make dash...
446
  		if ((p->early && parameq(param, p->str)) ||
18a8bd949   Yinghai Lu   serial: convert e...
447
448
449
  		    (strcmp(param, "console") == 0 &&
  		     strcmp(p->str, "earlycon") == 0)
  		) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
450
  			if (p->setup_func(val) != 0)
ea676e846   Andrew Morton   init/main.c: conv...
451
452
  				pr_warn("Malformed early option '%s'
  ", param);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
453
454
455
456
457
  		}
  	}
  	/* We accept everything at this stage. */
  	return 0;
  }
13977091a   Magnus Damm   Driver Core: earl...
458
459
  void __init parse_early_options(char *cmdline)
  {
ecc861705   Luis R. Rodriguez   module: add extra...
460
461
  	parse_args("early options", cmdline, NULL, 0, 0, 0, NULL,
  		   do_early_param);
13977091a   Magnus Damm   Driver Core: earl...
462
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
463
464
465
  /* Arch code calls this early on, or if not, just before other parsing. */
  void __init parse_early_param(void)
  {
dd4d9fecb   Fabian Frederick   init/main.c: code...
466
467
  	static int done __initdata;
  	static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
468
469
470
471
472
  
  	if (done)
  		return;
  
  	/* All fall through to do_early_param. */
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
473
  	strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
13977091a   Magnus Damm   Driver Core: earl...
474
  	parse_early_options(tmp_cmdline);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
475
476
  	done = 1;
  }
e7ff3a476   Thomas Gleixner   x86/amd: Check fo...
477
  void __init __weak arch_post_acpi_subsys_init(void) { }
839ad62e7   Benjamin Herrenschmidt   [POWERPC] Use __w...
478
  void __init __weak smp_setup_processor_id(void)
033ab7f8e   Andrew Morton   [PATCH] add smp_s...
479
480
  {
  }
eded09ccf   David Howells   FRV: gcc-4.1.2 al...
481
  # if THREAD_SIZE >= PAGE_SIZE
b235beea9   Linus Torvalds   Clarify naming of...
482
  void __init __weak thread_stack_cache_init(void)
8c9843e57   Benjamin Herrenschmidt   [POWERPC] Add thr...
483
484
  {
  }
eded09ccf   David Howells   FRV: gcc-4.1.2 al...
485
  #endif
8c9843e57   Benjamin Herrenschmidt   [POWERPC] Add thr...
486

c7753208a   Tom Lendacky   x86, swiotlb: Add...
487
  void __init __weak mem_encrypt_init(void) { }
4fc19708b   Nadav Amit   x86/alternatives:...
488
  void __init __weak poking_init(void) { }
782de70c4   Mike Rapoport   mm: consolidate p...
489
  void __init __weak pgtable_cache_init(void) { }
caa841360   Nadav Amit   x86/mm: Initializ...
490

4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
491
492
  bool initcall_debug;
  core_param(initcall_debug, initcall_debug, bool, 0644);
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
493
494
  
  #ifdef TRACEPOINTS_ENABLED
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
495
  static void __init initcall_debug_enable(void);
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
496
497
498
499
500
  #else
  static inline void initcall_debug_enable(void)
  {
  }
  #endif
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
501

23a5c8cb7   Alexander Potapenko   mm: init: report ...
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
  /* Report memory auto-initialization states for this boot. */
  static void __init report_meminit(void)
  {
  	const char *stack;
  
  	if (IS_ENABLED(CONFIG_INIT_STACK_ALL))
  		stack = "all";
  	else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL))
  		stack = "byref_all";
  	else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF))
  		stack = "byref";
  	else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_USER))
  		stack = "__user";
  	else
  		stack = "off";
  
  	pr_info("mem auto-init: stack:%s, heap alloc:%s, heap free:%s
  ",
  		stack, want_init_on_alloc(GFP_KERNEL) ? "on" : "off",
  		want_init_on_free() ? "on" : "off");
  	if (want_init_on_free())
  		pr_info("mem auto-init: clearing system memory may take some time...
  ");
  }
444f478f6   Pekka Enberg   init: introduce m...
526
527
528
529
530
  /*
   * Set up kernel memory allocators
   */
  static void __init mm_init(void)
  {
eefa864b7   Joonsoo Kim   mm/page_ext: resu...
531
532
533
534
535
  	/*
  	 * page_ext requires contiguous pages,
  	 * bigger than MAX_ORDER unless SPARSEMEM.
  	 */
  	page_ext_init_flatmem();
d30dce351   Vlastimil Babka   mm, debug_pageall...
536
  	init_debug_pagealloc();
23a5c8cb7   Alexander Potapenko   mm: init: report ...
537
  	report_meminit();
444f478f6   Pekka Enberg   init: introduce m...
538
539
  	mem_init();
  	kmem_cache_init();
c56658681   Catalin Marinas   mm: kmemleak: use...
540
  	kmemleak_init();
b35f1819a   Kirill A. Shutemov   mm: create a sepa...
541
  	pgtable_init();
a9ee3a63d   Qian Cai   debugobjects: cal...
542
  	debug_objects_mem_init();
444f478f6   Pekka Enberg   init: introduce m...
543
  	vmalloc_init();
0ddab1d2e   Toshi Kani   lib/ioremap.c: ad...
544
  	ioremap_huge_init();
613e396bc   Thomas Gleixner   init: Invoke init...
545
546
  	/* Should be run before the first non-init thread is created */
  	init_espfix_bsp();
aa8c6248f   Thomas Gleixner   x86/mm/pti: Add i...
547
548
  	/* Should be run after espfix64 is set up. */
  	pti_init();
444f478f6   Pekka Enberg   init: introduce m...
549
  }
53c99bd66   Martin Schwidefsky   init: add arch_ca...
550
551
552
553
  void __init __weak arch_call_rest_init(void)
  {
  	rest_init();
  }
722a9f929   Andi Kleen   asmlinkage: Add e...
554
  asmlinkage __visible void __init start_kernel(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
555
  {
dd4d9fecb   Fabian Frederick   init/main.c: code...
556
557
  	char *command_line;
  	char *after_dashes;
033ab7f8e   Andrew Morton   [PATCH] add smp_s...
558

d4311ff1a   Aaron Tomlin   init/main.c: Give...
559
  	set_task_stack_end_magic(&init_task);
73839c5b2   Ming Lei   init/main.c: Exec...
560
  	smp_setup_processor_id();
3ac7fe5a4   Thomas Gleixner   infrastructure to...
561
  	debug_objects_early_init();
420594296   Ingo Molnar   x86: fix the stac...
562

ddbcc7e8e   Paul Menage   Task Control Grou...
563
  	cgroup_init_early();
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
564
565
  
  	local_irq_disable();
2ce802f62   Tejun Heo   lockdep: Move ear...
566
  	early_boot_irqs_disabled = true;
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
567

1b3b3b49b   Viresh Kumar   init/main: proper...
568
569
570
571
  	/*
  	 * Interrupts are still disabled. Do necessary setups, then
  	 * enable them.
  	 */
44fd22992   Stas Sergeev   [PATCH] Register ...
572
  	boot_cpu_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
573
  	page_address_init();
ea676e846   Andrew Morton   init/main.c: conv...
574
  	pr_notice("%s", linux_banner);
e6b1db98c   Matthew Garrett   security: Support...
575
  	early_security_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
576
  	setup_arch(&command_line);
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
577
  	setup_command_line(command_line);
e0982e90c   Mike Travis   init: move setup ...
578
  	setup_nr_cpu_ids();
d6647bdf9   Tejun Heo   init: set nr_cpu_...
579
  	setup_per_cpu_areas();
44fd22992   Stas Sergeev   [PATCH] Register ...
580
  	smp_prepare_boot_cpu();	/* arch-specific boot-cpu hooks */
b5b1404d0   Linus Torvalds   init: rename and ...
581
  	boot_cpu_hotplug_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
582

72675e131   Michal Hocko   mm, memory_hotplu...
583
  	build_all_zonelists(NULL);
83b519e8b   Pekka Enberg   slab: setup alloc...
584
  	page_alloc_init();
ea676e846   Andrew Morton   init/main.c: conv...
585
586
  	pr_notice("Kernel command line: %s
  ", boot_command_line);
6041186a3   Dan Williams   init: initialize ...
587
588
  	/* parameters may set static keys */
  	jump_label_init();
83b519e8b   Pekka Enberg   slab: setup alloc...
589
  	parse_early_param();
51e158c12   Rusty Russell   param: hand argum...
590
591
592
  	after_dashes = parse_args("Booting kernel",
  				  static_command_line, __start___param,
  				  __stop___param - __start___param,
ecc861705   Luis R. Rodriguez   module: add extra...
593
  				  -1, -1, NULL, &unknown_bootoption);
3438cf549   Daniel Thompson   param: fix crash ...
594
  	if (!IS_ERR_OR_NULL(after_dashes))
51e158c12   Rusty Russell   param: hand argum...
595
  		parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
ecc861705   Luis R. Rodriguez   module: add extra...
596
  			   NULL, set_init_arg);
97ce2c88f   Jeremy Fitzhardinge   jump-label: initi...
597

83b519e8b   Pekka Enberg   slab: setup alloc...
598
599
600
601
  	/*
  	 * These use large bootmem allocations and must precede
  	 * kmem_cache_init()
  	 */
162a7e750   Mike Travis   printk: allocate ...
602
  	setup_log_buf(0);
83b519e8b   Pekka Enberg   slab: setup alloc...
603
604
605
  	vfs_caches_init_early();
  	sort_main_extable();
  	trap_init();
444f478f6   Pekka Enberg   init: introduce m...
606
  	mm_init();
de03c72cf   KOSAKI Motohiro   mm: convert mm->c...
607

f631718de   Steven Rostedt (VMware)   ftrace: Move ftra...
608
  	ftrace_init();
e725c731e   Steven Rostedt (VMware)   tracing: Split tr...
609
610
  	/* trace_printk can be enabled here */
  	early_trace_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
611
612
613
614
615
616
617
618
619
620
621
  	/*
  	 * Set up the scheduler prior starting any interrupts (such as the
  	 * timer interrupt). Full topology setup happens at smp_init()
  	 * time - but meanwhile we still have a functioning scheduler.
  	 */
  	sched_init();
  	/*
  	 * Disable preemption - early bootup scheduling is extremely
  	 * fragile until we cpu_idle() for the first time.
  	 */
  	preempt_disable();
dd4d9fecb   Fabian Frederick   init/main.c: code...
622
623
624
  	if (WARN(!irqs_disabled(),
  		 "Interrupts were enabled *very* early, fixing it
  "))
c4a68306b   Ard van Breemen   [PATCH] start_ker...
625
  		local_irq_disable();
0a835c4f0   Matthew Wilcox   Reimplement IDR a...
626
  	radix_tree_init();
3347fa092   Tejun Heo   workqueue: make w...
627
628
  
  	/*
7d229c668   Tal Shorer   main: kernel_star...
629
630
631
632
633
634
  	 * Set up housekeeping before setting up workqueues to allow the unbound
  	 * workqueue to take non-housekeeping into account.
  	 */
  	housekeeping_init();
  
  	/*
3347fa092   Tejun Heo   workqueue: make w...
635
636
637
638
639
  	 * Allow workqueue creation and work item queueing/cancelling
  	 * early.  Work item execution depends on kthreads and starts after
  	 * workqueue_init().
  	 */
  	workqueue_init_early();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
640
  	rcu_init();
5f893b263   Steven Rostedt (Red Hat)   tracing: Move ena...
641

e725c731e   Steven Rostedt (VMware)   tracing: Split tr...
642
  	/* Trace events are available after this */
5f893b263   Steven Rostedt (Red Hat)   tracing: Move ena...
643
  	trace_init();
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
644
645
  	if (initcall_debug)
  		initcall_debug_enable();
65f382fd0   Frederic Weisbecker   context_tracking:...
646
  	context_tracking_init();
0b8f1efad   Yinghai Lu   sparse irq_desc[]...
647
648
  	/* init some links before init_ISA_irqs() */
  	early_irq_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
649
  	init_IRQ();
ad2b13536   Thomas Gleixner   tick: Call tick_i...
650
  	tick_init();
d6dd50e07   Linus Torvalds   Merge branch 'cor...
651
  	rcu_init_nohz();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
652
  	init_timers();
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
653
  	hrtimers_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
654
  	softirq_init();
ad596171e   John Stultz   [PATCH] Time: Use...
655
  	timekeeping_init();
d55535232   Kees Cook   random: move rand...
656
657
658
659
660
661
662
663
664
665
666
667
668
  
  	/*
  	 * For best initial stack canary entropy, prepare it after:
  	 * - setup_arch() for any UEFI RNG entropy and boot cmdline access
  	 * - timekeeping_init() for ktime entropy used in rand_initialize()
  	 * - rand_initialize() to get any arch-specific entropy like RDRAND
  	 * - add_latent_entropy() to get any latent entropy
  	 * - adding command line entropy
  	 */
  	rand_initialize();
  	add_latent_entropy();
  	add_device_randomness(command_line, strlen(command_line));
  	boot_init_stack_canary();
88fecaa27   John Stultz   [PATCH] time init...
669
  	time_init();
9e6302056   Stephane Eranian   perf: Use hrtimer...
670
  	perf_event_init();
93e028148   Heiko Carstens   [PATCH] lockdep: ...
671
  	profile_init();
d8ad7d112   Takao Indoh   generic-ipi: Fix ...
672
  	call_function_init();
f91eb62f7   Steven Rostedt   init: scream bloo...
673
674
  	WARN(!irqs_disabled(), "Interrupts were enabled early
  ");
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
675

2ce802f62   Tejun Heo   lockdep: Move ear...
676
  	early_boot_irqs_disabled = false;
93e028148   Heiko Carstens   [PATCH] lockdep: ...
677
  	local_irq_enable();
dcce284a2   Benjamin Herrenschmidt   mm: Extend gfp ma...
678

7e85ee0c1   Pekka Enberg   slab,slub: don't ...
679
  	kmem_cache_init_late();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
680
681
682
683
684
685
686
687
  
  	/*
  	 * HACK ALERT! This is early. We're enabling the console before
  	 * we've done PCI setups etc, and console_init() must be aware of
  	 * this. But we do want output early, in case something goes wrong.
  	 */
  	console_init();
  	if (panic_later)
499a4584d   Tetsuo Handa   init: fix possibl...
688
689
  		panic("Too many boot %s vars at `%s'", panic_later,
  		      panic_param);
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
690

c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
691
  	lockdep_init();
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
692

9a11b49a8   Ingo Molnar   [PATCH] lockdep: ...
693
694
695
696
697
698
  	/*
  	 * Need to run this when irqs are enabled, because it wants
  	 * to self-test [hard/soft]-irqs on/off lock inversion bugs
  	 * too:
  	 */
  	locking_selftest();
c7753208a   Tom Lendacky   x86, swiotlb: Add...
699
700
701
702
703
704
705
  	/*
  	 * This needs to be called before any devices perform DMA
  	 * operations that might use the SWIOTLB bounce buffers. It will
  	 * mark the bounce buffers as decrypted so that their usage will
  	 * not cause "plain-text" data to be decrypted when accessed.
  	 */
  	mem_encrypt_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
706
707
  #ifdef CONFIG_BLK_DEV_INITRD
  	if (initrd_start && !initrd_below_start_ok &&
bd673c7c3   Geert Uytterhoeven   initrd: cast `ini...
708
  	    page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {
ea676e846   Andrew Morton   init/main.c: conv...
709
710
  		pr_crit("initrd overwritten (0x%08lx < 0x%08lx) - disabling it.
  ",
bd673c7c3   Geert Uytterhoeven   initrd: cast `ini...
711
712
  		    page_to_pfn(virt_to_page((void *)initrd_start)),
  		    min_low_pfn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
713
714
715
  		initrd_start = 0;
  	}
  #endif
e7c8d5c99   Christoph Lameter   [PATCH] node loca...
716
  	setup_per_cpu_pageset();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
717
  	numa_policy_init();
9c71206d0   Dou Liyang   ACPI/init: Invoke...
718
  	acpi_early_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
719
720
  	if (late_time_init)
  		late_time_init();
857baa87b   Pavel Tatashin   sched/clock: Enab...
721
  	sched_clock_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
722
  	calibrate_delay();
95846ecf9   Gargi Sharma   pid: replace pid ...
723
  	pid_idr_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
724
  	anon_vma_init();
11520e5e7   Linus Torvalds   Revert "x86-64/ef...
725
  #ifdef CONFIG_X86
83e681897   Matt Fleming   efi: Make 'efi_en...
726
  	if (efi_enabled(EFI_RUNTIME_SERVICES))
11520e5e7   Linus Torvalds   Revert "x86-64/ef...
727
728
  		efi_enter_virtual_mode();
  #endif
b235beea9   Linus Torvalds   Clarify naming of...
729
  	thread_stack_cache_init();
d84f4f992   David Howells   CRED: Inaugurate ...
730
  	cred_init();
ff691f6e0   Heinrich Schuchardt   kernel/fork.c: ne...
731
  	fork_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
732
  	proc_caches_init();
3ea056c50   Alexey Dobriyan   uts: create "stru...
733
  	uts_ns_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
734
  	buffer_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
735
736
  	key_init();
  	security_init();
0b4b3827d   Jason Wessel   x86, kgdb, init: ...
737
  	dbg_late_init();
4248b0da4   Mel Gorman   fs, file table: r...
738
  	vfs_caches_init();
629060270   Nicholas Piggin   mm: add PageWaite...
739
  	pagecache_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
740
  	signals_init();
096523203   Alexey Dobriyan   seq_file: allocat...
741
  	seq_file_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
742
  	proc_root_init();
e149ed2b8   Al Viro   take the targets ...
743
  	nsfs_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
744
  	cpuset_init();
695df2132   Zefan Li   cpuset: initializ...
745
  	cgroup_init();
c757249af   Shailabh Nagar   [PATCH] per-task-...
746
  	taskstats_init_early();
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
747
  	delayacct_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
748

4fc19708b   Nadav Amit   x86/alternatives:...
749
  	poking_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
750
  	check_bugs();
b064a8fa7   Rafael J. Wysocki   ACPI / init: Swit...
751
  	acpi_subsystem_init();
e7ff3a476   Thomas Gleixner   x86/amd: Check fo...
752
  	arch_post_acpi_subsys_init();
6ae6996a4   Feng Tang   SFI: add platform...
753
  	sfi_init_late();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
754
755
  
  	/* Do the rest non-__init'ed, we're now alive */
53c99bd66   Martin Schwidefsky   init: add arch_ca...
756
  	arch_call_rest_init();
91b9ce04f   Borislav Petkov   x86: Fix early bo...
757
758
  
  	prevent_tail_call_optimization();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
759
  }
b99b87f70   Peter Oberparleiter   kernel: construct...
760
761
762
763
  /* Call all constructor functions linked into the kernel. */
  static void __init do_ctors(void)
  {
  #ifdef CONFIG_CONSTRUCTORS
196a15b4e   H Hartley Sweeten   init/main.c: fix ...
764
  	ctor_fn_t *fn = (ctor_fn_t *) __ctors_start;
b99b87f70   Peter Oberparleiter   kernel: construct...
765

196a15b4e   H Hartley Sweeten   init/main.c: fix ...
766
767
  	for (; fn < (ctor_fn_t *) __ctors_end; fn++)
  		(*fn)();
b99b87f70   Peter Oberparleiter   kernel: construct...
768
769
  #endif
  }
7b0b73d76   Prarit Bhargava   init/main.c: add ...
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
  #ifdef CONFIG_KALLSYMS
  struct blacklist_entry {
  	struct list_head next;
  	char *buf;
  };
  
  static __initdata_or_module LIST_HEAD(blacklisted_initcalls);
  
  static int __init initcall_blacklist(char *str)
  {
  	char *str_entry;
  	struct blacklist_entry *entry;
  
  	/* str argument is a comma-separated list of functions */
  	do {
  		str_entry = strsep(&str, ",");
  		if (str_entry) {
  			pr_debug("blacklisting initcall %s
  ", str_entry);
7e1c4e279   Mike Rapoport   memblock: stop us...
789
790
  			entry = memblock_alloc(sizeof(*entry),
  					       SMP_CACHE_BYTES);
f5c7310ac   Mike Rapoport   init/main: add ch...
791
792
793
794
  			if (!entry)
  				panic("%s: Failed to allocate %zu bytes
  ",
  				      __func__, sizeof(*entry));
7e1c4e279   Mike Rapoport   memblock: stop us...
795
796
  			entry->buf = memblock_alloc(strlen(str_entry) + 1,
  						    SMP_CACHE_BYTES);
f5c7310ac   Mike Rapoport   init/main: add ch...
797
798
799
800
  			if (!entry->buf)
  				panic("%s: Failed to allocate %zu bytes
  ",
  				      __func__, strlen(str_entry) + 1);
7b0b73d76   Prarit Bhargava   init/main.c: add ...
801
802
803
804
805
806
807
808
809
810
  			strcpy(entry->buf, str_entry);
  			list_add(&entry->next, &blacklisted_initcalls);
  		}
  	} while (str_entry);
  
  	return 0;
  }
  
  static bool __init_or_module initcall_blacklisted(initcall_t fn)
  {
7b0b73d76   Prarit Bhargava   init/main.c: add ...
811
  	struct blacklist_entry *entry;
c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
812
  	char fn_name[KSYM_SYMBOL_LEN];
0fd5ed8d8   Rasmus Villemoes   init/main.c: fix ...
813
  	unsigned long addr;
7b0b73d76   Prarit Bhargava   init/main.c: add ...
814

c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
815
  	if (list_empty(&blacklisted_initcalls))
7b0b73d76   Prarit Bhargava   init/main.c: add ...
816
  		return false;
0fd5ed8d8   Rasmus Villemoes   init/main.c: fix ...
817
818
  	addr = (unsigned long) dereference_function_descriptor(fn);
  	sprint_symbol_no_offset(fn_name, addr);
c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
819

841c06d71   Prarit Bhargava   init: allow black...
820
821
822
823
824
  	/*
  	 * fn will be "function_name [module_name]" where [module_name] is not
  	 * displayed for built-in init functions.  Strip off the [module_name].
  	 */
  	strreplace(fn_name, ' ', '\0');
e6fd1fb3b   Geliang Tang   init/main.c: use ...
825
  	list_for_each_entry(entry, &blacklisted_initcalls, next) {
7b0b73d76   Prarit Bhargava   init/main.c: add ...
826
827
828
  		if (!strcmp(fn_name, entry->buf)) {
  			pr_debug("initcall %s blacklisted
  ", fn_name);
7b0b73d76   Prarit Bhargava   init/main.c: add ...
829
830
831
  			return true;
  		}
  	}
7b0b73d76   Prarit Bhargava   init/main.c: add ...
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
  	return false;
  }
  #else
  static int __init initcall_blacklist(char *str)
  {
  	pr_warn("initcall_blacklist requires CONFIG_KALLSYMS
  ");
  	return 0;
  }
  
  static bool __init_or_module initcall_blacklisted(initcall_t fn)
  {
  	return false;
  }
  #endif
  __setup("initcall_blacklist=", initcall_blacklist);
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
848
849
  static __init_or_module void
  trace_initcall_start_cb(void *data, initcall_t fn)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
850
  {
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
851
  	ktime_t *calltime = (ktime_t *)data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
852

d75f773c8   Sakari Ailus   treewide: Switch ...
853
854
  	printk(KERN_DEBUG "calling  %pS @ %i
  ", fn, task_pid_nr(current));
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
855
856
857
858
859
860
861
862
863
  	*calltime = ktime_get();
  }
  
  static __init_or_module void
  trace_initcall_finish_cb(void *data, initcall_t fn, int ret)
  {
  	ktime_t *calltime = (ktime_t *)data;
  	ktime_t delta, rettime;
  	unsigned long long duration;
22c5c03b4   Kevin Winchester   init/main.c: fix ...
864
  	rettime = ktime_get();
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
865
  	delta = ktime_sub(rettime, *calltime);
22c5c03b4   Kevin Winchester   init/main.c: fix ...
866
  	duration = (unsigned long long) ktime_to_ns(delta) >> 10;
d75f773c8   Sakari Ailus   treewide: Switch ...
867
868
  	printk(KERN_DEBUG "initcall %pS returned %d after %lld usecs
  ",
ea676e846   Andrew Morton   init/main.c: conv...
869
  		 fn, ret, duration);
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
870
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
871

4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
872
  static ktime_t initcall_calltime;
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
873
  #ifdef TRACEPOINTS_ENABLED
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
874
875
876
877
878
879
880
881
882
883
  static void __init initcall_debug_enable(void)
  {
  	int ret;
  
  	ret = register_trace_initcall_start(trace_initcall_start_cb,
  					    &initcall_calltime);
  	ret |= register_trace_initcall_finish(trace_initcall_finish_cb,
  					      &initcall_calltime);
  	WARN(ret, "Failed to register initcall tracepoints
  ");
22c5c03b4   Kevin Winchester   init/main.c: fix ...
884
  }
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
  # define do_trace_initcall_start	trace_initcall_start
  # define do_trace_initcall_finish	trace_initcall_finish
  #else
  static inline void do_trace_initcall_start(initcall_t fn)
  {
  	if (!initcall_debug)
  		return;
  	trace_initcall_start_cb(&initcall_calltime, fn);
  }
  static inline void do_trace_initcall_finish(initcall_t fn, int ret)
  {
  	if (!initcall_debug)
  		return;
  	trace_initcall_finish_cb(&initcall_calltime, fn, ret);
  }
  #endif /* !TRACEPOINTS_ENABLED */
22c5c03b4   Kevin Winchester   init/main.c: fix ...
901

e44612713   Kevin Winchester   init/main.c: mark...
902
  int __init_or_module do_one_initcall(initcall_t fn)
22c5c03b4   Kevin Winchester   init/main.c: fix ...
903
904
  {
  	int count = preempt_count();
ff1c8fac8   Steven Rostedt   init: remove perm...
905
  	char msgbuf[64];
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
906
  	int ret;
22c5c03b4   Kevin Winchester   init/main.c: fix ...
907

7b0b73d76   Prarit Bhargava   init/main.c: add ...
908
909
  	if (initcall_blacklisted(fn))
  		return -EPERM;
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
910
  	do_trace_initcall_start(fn);
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
911
  	ret = fn();
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
912
  	do_trace_initcall_finish(fn, ret);
8f0c45cdf   Ingo Molnar   enhance initcall_...
913

e0df154f4   Linus Torvalds   Split up 'do_init...
914
  	msgbuf[0] = 0;
e662e1cfd   Cyrill Gorcunov   init: don't lose ...
915

e0df154f4   Linus Torvalds   Split up 'do_init...
916
  	if (preempt_count() != count) {
bf5d770bd   Steven Rostedt   init: Do not warn...
917
  		sprintf(msgbuf, "preemption imbalance ");
4a2b4b222   Peter Zijlstra   sched: Introduce ...
918
  		preempt_count_set(count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
919
  	}
e0df154f4   Linus Torvalds   Split up 'do_init...
920
  	if (irqs_disabled()) {
a76bfd0da   Cyrill Gorcunov   initcalls: Fix m6...
921
  		strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
e0df154f4   Linus Torvalds   Split up 'do_init...
922
923
  		local_irq_enable();
  	}
d75f773c8   Sakari Ailus   treewide: Switch ...
924
925
  	WARN(msgbuf[0], "initcall %pS returned with %s
  ", fn, msgbuf);
59f9415ff   Arjan van de Ven   modules: extend i...
926

38addce8b   Emese Revfy   gcc-plugins: Add ...
927
  	add_latent_entropy();
30dbb20e6   Américo Wang   tracing: Remove b...
928
  	return ret;
e0df154f4   Linus Torvalds   Split up 'do_init...
929
  }
1b1eeca7e   Ard Biesheuvel   init: allow initc...
930
931
932
933
934
935
936
937
938
939
940
941
  extern initcall_entry_t __initcall_start[];
  extern initcall_entry_t __initcall0_start[];
  extern initcall_entry_t __initcall1_start[];
  extern initcall_entry_t __initcall2_start[];
  extern initcall_entry_t __initcall3_start[];
  extern initcall_entry_t __initcall4_start[];
  extern initcall_entry_t __initcall5_start[];
  extern initcall_entry_t __initcall6_start[];
  extern initcall_entry_t __initcall7_start[];
  extern initcall_entry_t __initcall_end[];
  
  static initcall_entry_t *initcall_levels[] __initdata = {
026cee008   Pawel Moll   params: <level>_i...
942
943
944
945
946
947
948
949
950
951
  	__initcall0_start,
  	__initcall1_start,
  	__initcall2_start,
  	__initcall3_start,
  	__initcall4_start,
  	__initcall5_start,
  	__initcall6_start,
  	__initcall7_start,
  	__initcall_end,
  };
96263d286   Jim Cromie   init: add comment...
952
  /* Keep these in sync with initcalls in include/linux/init.h */
7c8f71935   Alexey Dobriyan   init/main.c: make...
953
  static const char *initcall_level_names[] __initdata = {
a6fb6012e   Steven Rostedt (VMware)   init: Fix initcal...
954
  	"pure",
9fb48c744   Jim Cromie   params: add 3rd a...
955
956
957
958
959
960
961
  	"core",
  	"postcore",
  	"arch",
  	"subsys",
  	"fs",
  	"device",
  	"late",
026cee008   Pawel Moll   params: <level>_i...
962
  };
026cee008   Pawel Moll   params: <level>_i...
963
  static void __init do_initcall_level(int level)
e0df154f4   Linus Torvalds   Split up 'do_init...
964
  {
1b1eeca7e   Ard Biesheuvel   init: allow initc...
965
  	initcall_entry_t *fn;
e0df154f4   Linus Torvalds   Split up 'do_init...
966

08746a65c   Krzysztof Mazur   init: fix in-plac...
967
  	strcpy(initcall_command_line, saved_command_line);
026cee008   Pawel Moll   params: <level>_i...
968
  	parse_args(initcall_level_names[level],
08746a65c   Krzysztof Mazur   init: fix in-plac...
969
  		   initcall_command_line, __start___param,
026cee008   Pawel Moll   params: <level>_i...
970
971
  		   __stop___param - __start___param,
  		   level, level,
ecc861705   Luis R. Rodriguez   module: add extra...
972
  		   NULL, &repair_env_string);
026cee008   Pawel Moll   params: <level>_i...
973

4ee7c60de   Steven Rostedt (VMware)   init, tracing: Ad...
974
  	trace_initcall_level(initcall_level_names[level]);
026cee008   Pawel Moll   params: <level>_i...
975
  	for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
1b1eeca7e   Ard Biesheuvel   init: allow initc...
976
  		do_one_initcall(initcall_from_entry(fn));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
977
  }
026cee008   Pawel Moll   params: <level>_i...
978
979
980
  static void __init do_initcalls(void)
  {
  	int level;
19efb72fd   Borislav Petkov   init: Drop initca...
981
  	for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++)
026cee008   Pawel Moll   params: <level>_i...
982
983
  		do_initcall_level(level);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
984
985
986
987
988
989
990
991
992
  /*
   * Ok, the machine is now initialized. None of the devices
   * have been touched yet, but the CPU subsystem is up and
   * running, and memory and process management works.
   *
   * Now we can finally start doing some real work..
   */
  static void __init do_basic_setup(void)
  {
759ee0915   Lai Jiangshan   init,cpuset: fix ...
993
  	cpuset_init_smp();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
994
  	driver_init();
b04c3afb2   Eric W. Biederman   [PATCH] sysctl: m...
995
  	init_irq_proc();
b99b87f70   Peter Oberparleiter   kernel: construct...
996
  	do_ctors();
d5767c535   Linus Torvalds   bootup: move 'use...
997
  	usermodehelper_enable();
b0f84374b   wangyanqing   bootup: move 'use...
998
  	do_initcalls();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
999
  }
7babe8db9   Eduard - Gabriel Munteanu   Full conversion t...
1000
  static void __init do_pre_smp_initcalls(void)
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
1001
  {
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1002
  	initcall_entry_t *fn;
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
1003

4ee7c60de   Steven Rostedt (VMware)   init, tracing: Ad...
1004
  	trace_initcall_level("early");
026cee008   Pawel Moll   params: <level>_i...
1005
  	for (fn = __initcall_start; fn < __initcall0_start; fn++)
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1006
  		do_one_initcall(initcall_from_entry(fn));
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
1007
  }
a74fb73c1   Al Viro   infrastructure fo...
1008
  static int run_init_process(const char *init_filename)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1009
1010
  {
  	argv_init[0] = init_filename;
3f5c15d8a   Paul Menzel   init/main.c: log ...
1011
1012
  	pr_info("Run %s as init process
  ", init_filename);
c4ad8f98b   Linus Torvalds   execve: use 'stru...
1013
  	return do_execve(getname_kernel(init_filename),
ae903caae   Al Viro   Bury the conditio...
1014
1015
  		(const char __user *const __user *)argv_init,
  		(const char __user *const __user *)envp_init);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1016
  }
ba24762bd   Michael Opdenacker   init: make init f...
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
  static int try_to_run_init_process(const char *init_filename)
  {
  	int ret;
  
  	ret = run_init_process(init_filename);
  
  	if (ret && ret != -ENOENT) {
  		pr_err("Starting init: %s exists but couldn't execute it (error %d)
  ",
  		       init_filename, ret);
  	}
  
  	return ret;
  }
f80b0c904   Vineet Gupta   Ensure that kerne...
1031
  static noinline void __init kernel_init_freeable(void);
d6b212380   Al Viro   make sure that we...
1032

0f5bf6d0a   Laura Abbott   arch: Rename CONF...
1033
  #if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
39290b389   AKASHI Takahiro   module: extend 'r...
1034
  bool rodata_enabled __ro_after_init = true;
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1035
1036
1037
1038
1039
  static int __init set_debug_rodata(char *str)
  {
  	return strtobool(str, &rodata_enabled);
  }
  __setup("rodata=", set_debug_rodata);
39290b389   AKASHI Takahiro   module: extend 'r...
1040
  #endif
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1041

0f5bf6d0a   Laura Abbott   arch: Rename CONF...
1042
  #ifdef CONFIG_STRICT_KERNEL_RWX
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1043
1044
  static void mark_readonly(void)
  {
2959a5f72   Jinbum Park   mm: add arch-inde...
1045
  	if (rodata_enabled) {
ae646f0b9   Jeffrey Hugo   init: fix false p...
1046
  		/*
ba1803142   Paul E. McKenney   main: Replace rcu...
1047
1048
  		 * load_module() results in W+X mappings, which are cleaned
  		 * up with call_rcu().  Let's make sure that queued work is
ae646f0b9   Jeffrey Hugo   init: fix false p...
1049
1050
1051
  		 * flushed so that we don't hit false positives looking for
  		 * insecure pages which are W+X.
  		 */
ba1803142   Paul E. McKenney   main: Replace rcu...
1052
  		rcu_barrier();
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1053
  		mark_rodata_ro();
2959a5f72   Jinbum Park   mm: add arch-inde...
1054
1055
  		rodata_test();
  	} else
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
  		pr_info("Kernel memory protection disabled.
  ");
  }
  #else
  static inline void mark_readonly(void)
  {
  	pr_warn("This architecture does not have kernel memory protection.
  ");
  }
  #endif
997aef68a   Mike Rapoport   init: provide a g...
1066
1067
  void __weak free_initmem(void)
  {
f40399992   Mike Rapoport   init: free_initme...
1068
  	free_initmem_default(POISON_FREE_INITMEM);
997aef68a   Mike Rapoport   init: provide a g...
1069
  }
d6b212380   Al Viro   make sure that we...
1070
  static int __ref kernel_init(void *unused)
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1071
  {
ba24762bd   Michael Opdenacker   init: make init f...
1072
  	int ret;
d6b212380   Al Viro   make sure that we...
1073
  	kernel_init_freeable();
22a9d6456   Arjan van de Ven   async: Asynchrono...
1074
1075
  	/* need to finish all async __init code before freeing the memory */
  	async_synchronize_full();
c4ab0a837   Masami Hiramatsu   kprobes: tracing/...
1076
  	kprobe_free_init_mem();
b80f0f6c9   Steven Rostedt (VMware)   ftrace: Have init...
1077
  	ftrace_free_init_mem();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1078
  	free_initmem();
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1079
  	mark_readonly();
b976690f5   Joerg Roedel   x86/mm/pti: Intro...
1080
1081
1082
1083
1084
1085
  
  	/*
  	 * Kernel mappings are now finalized - update the userspace page-table
  	 * to finalize PTI.
  	 */
  	pti_finalize();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1086
1087
  	system_state = SYSTEM_RUNNING;
  	numa_default_policy();
967dcb8fe   Paul E. McKenney   rcu: Wire up rcu_...
1088
  	rcu_end_inkernel_boot();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1089
  	if (ramdisk_execute_command) {
ba24762bd   Michael Opdenacker   init: make init f...
1090
1091
  		ret = run_init_process(ramdisk_execute_command);
  		if (!ret)
a74fb73c1   Al Viro   infrastructure fo...
1092
  			return 0;
ba24762bd   Michael Opdenacker   init: make init f...
1093
1094
1095
  		pr_err("Failed to execute %s (error %d)
  ",
  		       ramdisk_execute_command, ret);
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1096
1097
1098
1099
1100
1101
1102
1103
1104
  	}
  
  	/*
  	 * We try each of these until one succeeds.
  	 *
  	 * The Bourne shell can be used instead of init if we are
  	 * trying to recover a really broken machine.
  	 */
  	if (execute_command) {
ba24762bd   Michael Opdenacker   init: make init f...
1105
1106
  		ret = run_init_process(execute_command);
  		if (!ret)
a74fb73c1   Al Viro   infrastructure fo...
1107
  			return 0;
6ef4536e2   Andy Lutomirski   init: allow CONFI...
1108
1109
  		panic("Requested init %s failed (error %d).",
  		      execute_command, ret);
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1110
  	}
ba24762bd   Michael Opdenacker   init: make init f...
1111
1112
1113
1114
  	if (!try_to_run_init_process("/sbin/init") ||
  	    !try_to_run_init_process("/etc/init") ||
  	    !try_to_run_init_process("/bin/init") ||
  	    !try_to_run_init_process("/bin/sh"))
a74fb73c1   Al Viro   infrastructure fo...
1115
  		return 0;
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1116

ba24762bd   Michael Opdenacker   init: make init f...
1117
  	panic("No working init found.  Try passing init= option to kernel. "
8c27ceff3   Mauro Carvalho Chehab   docs: fix locatio...
1118
  	      "See Linux Documentation/admin-guide/init.rst for guidance.");
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1119
  }
f80b0c904   Vineet Gupta   Ensure that kerne...
1120
  static noinline void __init kernel_init_freeable(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1121
  {
b433c3d45   Peter Zijlstra   init, sched: Fix ...
1122
1123
1124
1125
  	/*
  	 * Wait until kthreadd is all set-up.
  	 */
  	wait_for_completion(&kthreadd_done);
31a67102f   Linus Torvalds   Fix blocking allo...
1126
1127
1128
  
  	/* Now the scheduler is fully set up and can do blocking allocations */
  	gfp_allowed_mask = __GFP_BITS_MASK;
58568d2a8   Miao Xie   cpuset,mm: update...
1129
1130
1131
  	/*
  	 * init can allocate pages on any node
  	 */
3c466d46a   Lai Jiangshan   init: use N_MEMOR...
1132
  	set_mems_allowed(node_states[N_MEMORY]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1133

9ec52099e   Cedric Le Goater   [PATCH] replace c...
1134
  	cad_pid = task_pid(current);
ca74a6f84   Andi Kleen   x86: optimize loc...
1135
  	smp_prepare_cpus(setup_max_cpus);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1136

3347fa092   Tejun Heo   workqueue: make w...
1137
  	workqueue_init();
597b7305d   Michal Hocko   mm: move mm_percp...
1138
  	init_mm_internals();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1139
  	do_pre_smp_initcalls();
004417a6d   Peter Zijlstra   perf, arch: Clean...
1140
  	lockup_detector_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1141

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1142
1143
  	smp_init();
  	sched_init_smp();
0e1cc95b4   Mel Gorman   mm: meminit: fini...
1144
  	page_alloc_init_late();
2f1ee0913   Qian Cai   Revert "mm: use e...
1145
1146
  	/* Initialize page ext after all struct pages are initialized. */
  	page_ext_init();
0e1cc95b4   Mel Gorman   mm: meminit: fini...
1147

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1148
  	do_basic_setup();
2bd3a997b   Eric W. Biederman   init: Open /dev/c...
1149
  	/* Open the /dev/console on the rootfs, this should never fail */
bae217ea8   Dominik Brodowski   fs: add ksys_open...
1150
  	if (ksys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
ea676e846   Andrew Morton   init/main.c: conv...
1151
1152
  		pr_err("Warning: unable to open an initial console.
  ");
2bd3a997b   Eric W. Biederman   init: Open /dev/c...
1153

c7248321a   Dominik Brodowski   fs: add ksys_dup{...
1154
1155
  	(void) ksys_dup(0);
  	(void) ksys_dup(0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1156
1157
1158
1159
  	/*
  	 * check if there is an early userspace init.  If yes, let it do all
  	 * the work
  	 */
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
1160
1161
1162
  
  	if (!ramdisk_execute_command)
  		ramdisk_execute_command = "/init";
cbfe20f56   Dominik Brodowski   fs: add do_facces...
1163
1164
  	if (ksys_access((const char __user *)
  			ramdisk_execute_command, 0) != 0) {
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
1165
  		ramdisk_execute_command = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1166
  		prepare_namespace();
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
1167
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1168
1169
1170
1171
1172
  
  	/*
  	 * Ok, we have completed the initial bootup, and
  	 * we're essentially up and running. Get rid of the
  	 * initmem segments and start the user-mode stuff..
c9cd2ce2b   Dmitry Kasatkin   integrity: provid...
1173
1174
1175
  	 *
  	 * rootfs is available now, try loading the public keys
  	 * and default modules
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1176
  	 */
bb813f4c9   Tejun Heo   init, block: try ...
1177

c9cd2ce2b   Dmitry Kasatkin   integrity: provid...
1178
  	integrity_load_keys();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1179
  }