Blame view

init/main.c 35.4 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>
7684b8582   Masami Hiramatsu   bootconfig: Load ...
29
  #include <linux/bootconfig.h>
0c688614d   Nicolas Pitre   console: move con...
30
  #include <linux/console.h>
38b8d208a   Ingo Molnar   sched/headers: Pr...
31
  #include <linux/nmi.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
33
  #include <linux/percpu.h>
  #include <linux/kmod.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>
4c002c978   Greg Kroah-Hartman   device.h: move 's...
65
  #include <linux/device/driver.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;
51887d03a   Masami Hiramatsu   bootconfig: init:...
136
137
  /* Untouched extra command line */
  static char *extra_command_line;
131991620   Masami Hiramatsu   bootconfig: init:...
138
139
  /* Extra init arguments */
  static char *extra_init_args;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140

f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
141
142
143
144
145
146
147
148
  #ifdef CONFIG_BOOT_CONFIG
  /* Is bootconfig on command line? */
  static bool bootconfig_found;
  static bool initargs_found;
  #else
  # define bootconfig_found false
  # define initargs_found false
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
  static char *execute_command;
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
150
  static char *ramdisk_execute_command;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
151

8b3b29550   Jan Beulich   adjust nosmp hand...
152
  /*
c4b2c0c5f   Hannes Frederic Sowa   static_key: WARN ...
153
154
155
   * Used to generate warnings if static_key manipulation functions are used
   * before jump_label_init is called.
   */
dd4d9fecb   Fabian Frederick   init/main.c: code...
156
  bool static_key_initialized __read_mostly;
c4b2c0c5f   Hannes Frederic Sowa   static_key: WARN ...
157
158
159
  EXPORT_SYMBOL_GPL(static_key_initialized);
  
  /*
8b3b29550   Jan Beulich   adjust nosmp hand...
160
161
162
163
164
   * 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...
165
   * For ex. kdump situation where previous kernel has crashed, BIOS has been
8b3b29550   Jan Beulich   adjust nosmp hand...
166
167
168
169
   * skipped and devices will be in unknown state.
   */
  unsigned int reset_devices;
  EXPORT_SYMBOL(reset_devices);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170

7e96287dd   Vivek Goyal   [PATCH] kdump: in...
171
172
173
174
175
176
177
  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...
178
179
  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
180
  static const char *panic_later, *panic_param;
914dcaa84   Rusty Russell   param: make param...
181
  extern const struct obs_kernel_param __setup_start[], __setup_end[];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182

31c025b5f   Yaowei Bai   init/main.c: obso...
183
  static bool __init obsolete_checksetup(char *line)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
184
  {
914dcaa84   Rusty Russell   param: make param...
185
  	const struct obs_kernel_param *p;
31c025b5f   Yaowei Bai   init/main.c: obso...
186
  	bool had_early_param = false;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
187
188
189
190
  
  	p = __setup_start;
  	do {
  		int n = strlen(p->str);
b1e4d20cb   Michal Schmidt   params: make dash...
191
  		if (parameqn(line, p->str, n)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192
  			if (p->early) {
33df0d19e   Rusty Russell   [PATCH] Allow ear...
193
194
195
196
  				/* 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
197
  				if (line[n] == '\0' || line[n] == '=')
31c025b5f   Yaowei Bai   init/main.c: obso...
198
  					had_early_param = true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
199
  			} else if (!p->setup_func) {
ea676e846   Andrew Morton   init/main.c: conv...
200
201
202
  				pr_warn("Parameter %s is obsolete, ignored
  ",
  					p->str);
31c025b5f   Yaowei Bai   init/main.c: obso...
203
  				return true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
  			} else if (p->setup_func(line + n))
31c025b5f   Yaowei Bai   init/main.c: obso...
205
  				return true;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
207
208
  		}
  		p++;
  	} while (p < __setup_end);
33df0d19e   Rusty Russell   [PATCH] Allow ear...
209
210
  
  	return had_early_param;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
211
212
213
214
215
216
217
  }
  
  /*
   * 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
218
219
220
221
  EXPORT_SYMBOL(loops_per_jiffy);
  
  static int __init debug_kernel(char *str)
  {
a8fe19ebf   Borislav Petkov   kernel/printk: us...
222
  	console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
f6f21c814   Yinghai Lu   Convert loglevel-...
223
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
224
225
226
227
  }
  
  static int __init quiet_kernel(char *str)
  {
a8fe19ebf   Borislav Petkov   kernel/printk: us...
228
  	console_loglevel = CONSOLE_LOGLEVEL_QUIET;
f6f21c814   Yinghai Lu   Convert loglevel-...
229
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230
  }
f6f21c814   Yinghai Lu   Convert loglevel-...
231
232
  early_param("debug", debug_kernel);
  early_param("quiet", quiet_kernel);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
234
235
  
  static int __init loglevel(char *str)
  {
808bf29b9   Alexander Sverdlin   init: carefully h...
236
237
238
239
240
241
242
243
244
245
246
247
248
  	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
249
  }
f6f21c814   Yinghai Lu   Convert loglevel-...
250
  early_param("loglevel", loglevel);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251

7684b8582   Masami Hiramatsu   bootconfig: Load ...
252
  #ifdef CONFIG_BOOT_CONFIG
51887d03a   Masami Hiramatsu   bootconfig: init:...
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
  
  char xbc_namebuf[XBC_KEYLEN_MAX] __initdata;
  
  #define rest(dst, end) ((end) > (dst) ? (end) - (dst) : 0)
  
  static int __init xbc_snprint_cmdline(char *buf, size_t size,
  				      struct xbc_node *root)
  {
  	struct xbc_node *knode, *vnode;
  	char *end = buf + size;
  	char c = '\"';
  	const char *val;
  	int ret;
  
  	xbc_node_for_each_key_value(root, knode, val) {
  		ret = xbc_node_compose_key_after(root, knode,
  					xbc_namebuf, XBC_KEYLEN_MAX);
  		if (ret < 0)
  			return ret;
  
  		vnode = xbc_node_get_child(knode);
  		ret = snprintf(buf, rest(buf, end), "%s%c", xbc_namebuf,
  				vnode ? '=' : ' ');
  		if (ret < 0)
  			return ret;
  		buf += ret;
  		if (!vnode)
  			continue;
  
  		c = '\"';
  		xbc_array_for_each_value(vnode, val) {
  			ret = snprintf(buf, rest(buf, end), "%c%s", c, val);
  			if (ret < 0)
  				return ret;
  			buf += ret;
  			c = ',';
  		}
  		if (rest(buf, end) > 2)
  			strcpy(buf, "\" ");
  		buf += 2;
  	}
  
  	return buf - (end - size);
  }
  #undef rest
  
  /* Make an extra command line under given key word */
  static char * __init xbc_make_cmdline(const char *key)
  {
  	struct xbc_node *root;
  	char *new_cmdline;
  	int ret, len = 0;
  
  	root = xbc_find_node(key);
  	if (!root)
  		return NULL;
  
  	/* Count required buffer size */
  	len = xbc_snprint_cmdline(NULL, 0, root);
  	if (len <= 0)
  		return NULL;
  
  	new_cmdline = memblock_alloc(len + 1, SMP_CACHE_BYTES);
  	if (!new_cmdline) {
  		pr_err("Failed to allocate memory for extra kernel cmdline.
  ");
  		return NULL;
  	}
  
  	ret = xbc_snprint_cmdline(new_cmdline, len + 1, root);
  	if (ret < 0 || ret > len) {
  		pr_err("Failed to print extra kernel cmdline.
  ");
  		return NULL;
  	}
  
  	return new_cmdline;
  }
7684b8582   Masami Hiramatsu   bootconfig: Load ...
331
332
333
334
335
336
337
338
339
  u32 boot_config_checksum(unsigned char *p, u32 size)
  {
  	u32 ret = 0;
  
  	while (size--)
  		ret += *p++;
  
  	return ret;
  }
f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
340
341
342
343
344
345
346
347
348
349
  static int __init bootconfig_params(char *param, char *val,
  				    const char *unused, void *arg)
  {
  	if (strcmp(param, "bootconfig") == 0) {
  		bootconfig_found = true;
  	} else if (strcmp(param, "--") == 0) {
  		initargs_found = true;
  	}
  	return 0;
  }
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
350
  static void __init setup_boot_config(const char *cmdline)
7684b8582   Masami Hiramatsu   bootconfig: Load ...
351
  {
f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
352
  	static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata;
7684b8582   Masami Hiramatsu   bootconfig: Load ...
353
354
355
  	u32 size, csum;
  	char *data, *copy;
  	u32 *hdr;
a00574036   Masami Hiramatsu   bootconfig: Show ...
356
  	int ret;
7684b8582   Masami Hiramatsu   bootconfig: Load ...
357

f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
358
359
360
361
362
  	strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
  	parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL,
  		   bootconfig_params);
  
  	if (!bootconfig_found)
7684b8582   Masami Hiramatsu   bootconfig: Load ...
363
  		return;
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
364
365
  	if (!initrd_end)
  		goto not_found;
7684b8582   Masami Hiramatsu   bootconfig: Load ...
366
367
368
  	hdr = (u32 *)(initrd_end - 8);
  	size = hdr[0];
  	csum = hdr[1];
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
369
370
371
372
  	if (size >= XBC_DATA_MAX) {
  		pr_err("bootconfig size %d greater than max size %d
  ",
  			size, XBC_DATA_MAX);
7684b8582   Masami Hiramatsu   bootconfig: Load ...
373
  		return;
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
374
  	}
7684b8582   Masami Hiramatsu   bootconfig: Load ...
375
376
377
  
  	data = ((void *)hdr) - size;
  	if ((unsigned long)data < initrd_start)
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
378
  		goto not_found;
7684b8582   Masami Hiramatsu   bootconfig: Load ...
379

7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
380
381
382
  	if (boot_config_checksum((unsigned char *)data, size) != csum) {
  		pr_err("bootconfig checksum failed
  ");
7684b8582   Masami Hiramatsu   bootconfig: Load ...
383
  		return;
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
384
  	}
7684b8582   Masami Hiramatsu   bootconfig: Load ...
385
386
387
  
  	copy = memblock_alloc(size + 1, SMP_CACHE_BYTES);
  	if (!copy) {
e241d14a8   Masami Hiramatsu   bootconfig: Use b...
388
389
  		pr_err("Failed to allocate memory for bootconfig
  ");
7684b8582   Masami Hiramatsu   bootconfig: Load ...
390
391
392
393
394
  		return;
  	}
  
  	memcpy(copy, data, size);
  	copy[size] = '\0';
a00574036   Masami Hiramatsu   bootconfig: Show ...
395
396
  	ret = xbc_init(copy);
  	if (ret < 0)
e241d14a8   Masami Hiramatsu   bootconfig: Use b...
397
398
  		pr_err("Failed to parse bootconfig
  ");
51887d03a   Masami Hiramatsu   bootconfig: init:...
399
  	else {
a00574036   Masami Hiramatsu   bootconfig: Show ...
400
401
  		pr_info("Load bootconfig: %d bytes %d nodes
  ", size, ret);
51887d03a   Masami Hiramatsu   bootconfig: init:...
402
403
  		/* keys starting with "kernel." are passed via cmdline */
  		extra_command_line = xbc_make_cmdline("kernel");
131991620   Masami Hiramatsu   bootconfig: init:...
404
405
  		/* Also, "init." keys are init arguments */
  		extra_init_args = xbc_make_cmdline("init");
51887d03a   Masami Hiramatsu   bootconfig: init:...
406
  	}
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
407
408
409
410
  	return;
  not_found:
  	pr_err("'bootconfig' found on command line, but no bootconfig found
  ");
7684b8582   Masami Hiramatsu   bootconfig: Load ...
411
412
  }
  #else
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
413
  #define setup_boot_config(cmdline)	do { } while (0)
7684b8582   Masami Hiramatsu   bootconfig: Load ...
414
  #endif
a99cd1125   Chris Metcalf   init: fix bug whe...
415
  /* Change NUL term back to "=", to make "param" the whole string. */
7e2762e1d   Arvind Sankar   init/main.c: remo...
416
  static void __init repair_env_string(char *param, char *val)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
417
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
418
419
420
421
422
423
424
  	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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
425
426
427
  		} else
  			BUG();
  	}
a99cd1125   Chris Metcalf   init: fix bug whe...
428
  }
51e158c12   Rusty Russell   param: hand argum...
429
  /* Anything after -- gets handed straight to init. */
ecc861705   Luis R. Rodriguez   module: add extra...
430
431
  static int __init set_init_arg(char *param, char *val,
  			       const char *unused, void *arg)
51e158c12   Rusty Russell   param: hand argum...
432
433
434
435
436
  {
  	unsigned int i;
  
  	if (panic_later)
  		return 0;
7e2762e1d   Arvind Sankar   init/main.c: remo...
437
  	repair_env_string(param, val);
51e158c12   Rusty Russell   param: hand argum...
438
439
440
441
442
443
444
445
446
447
448
  
  	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...
449
450
451
452
  /*
   * 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...
453
454
  static int __init unknown_bootoption(char *param, char *val,
  				     const char *unused, void *arg)
a99cd1125   Chris Metcalf   init: fix bug whe...
455
  {
283900e82   Arvind Sankar   init/main.c: fix ...
456
  	size_t len = strlen(param);
7e2762e1d   Arvind Sankar   init/main.c: remo...
457
  	repair_env_string(param, val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
458
459
460
461
  
  	/* Handle obsolete-style parameters */
  	if (obsolete_checksetup(param))
  		return 0;
f066a4f6d   Rusty Russell   param: don't comp...
462
  	/* Unused module parameter. */
283900e82   Arvind Sankar   init/main.c: fix ...
463
  	if (strnchr(param, len, '.'))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
464
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
465
466
467
468
469
470
471
472
473
  
  	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...
474
  				panic_later = "env";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
475
476
  				panic_param = param;
  			}
283900e82   Arvind Sankar   init/main.c: fix ...
477
  			if (!strncmp(param, envp_init[i], len+1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
478
479
480
481
482
483
484
485
  				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...
486
  				panic_later = "init";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
  				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...
511
512
513
514
515
516
517
518
519
520
521
  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
522
  #ifndef CONFIG_SMP
34db18a05   Amerigo Wang   smp: move smp set...
523
  static const unsigned int setup_max_cpus = NR_CPUS;
e0982e90c   Mike Travis   init: move setup ...
524
  static inline void setup_nr_cpu_ids(void) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
525
  static inline void smp_prepare_cpus(unsigned int maxcpus) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
526
527
528
  #endif
  
  /*
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
529
530
531
532
533
534
535
   * 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)
  {
131991620   Masami Hiramatsu   bootconfig: init:...
536
  	size_t len, xlen = 0, ilen = 0;
f5c7310ac   Mike Rapoport   init/main: add ch...
537

51887d03a   Masami Hiramatsu   bootconfig: init:...
538
539
  	if (extra_command_line)
  		xlen = strlen(extra_command_line);
131991620   Masami Hiramatsu   bootconfig: init:...
540
541
  	if (extra_init_args)
  		ilen = strlen(extra_init_args) + 4; /* for " -- " */
f5c7310ac   Mike Rapoport   init/main: add ch...
542

51887d03a   Masami Hiramatsu   bootconfig: init:...
543
  	len = xlen + strlen(boot_command_line) + 1;
f5c7310ac   Mike Rapoport   init/main: add ch...
544

131991620   Masami Hiramatsu   bootconfig: init:...
545
  	saved_command_line = memblock_alloc(len + ilen, SMP_CACHE_BYTES);
f5c7310ac   Mike Rapoport   init/main: add ch...
546
  	if (!saved_command_line)
131991620   Masami Hiramatsu   bootconfig: init:...
547
548
  		panic("%s: Failed to allocate %zu bytes
  ", __func__, len + ilen);
f5c7310ac   Mike Rapoport   init/main: add ch...
549
550
551
552
553
  
  	static_command_line = memblock_alloc(len, SMP_CACHE_BYTES);
  	if (!static_command_line)
  		panic("%s: Failed to allocate %zu bytes
  ", __func__, len);
51887d03a   Masami Hiramatsu   bootconfig: init:...
554
555
556
557
558
559
560
561
562
563
564
  	if (xlen) {
  		/*
  		 * We have to put extra_command_line before boot command
  		 * lines because there could be dashes (separator of init
  		 * command line) in the command lines.
  		 */
  		strcpy(saved_command_line, extra_command_line);
  		strcpy(static_command_line, extra_command_line);
  	}
  	strcpy(saved_command_line + xlen, boot_command_line);
  	strcpy(static_command_line + xlen, command_line);
131991620   Masami Hiramatsu   bootconfig: init:...
565
566
567
568
569
570
571
572
  
  	if (ilen) {
  		/*
  		 * Append supplemental init boot args to saved_command_line
  		 * so that user can check what command line options passed
  		 * to init.
  		 */
  		len = strlen(saved_command_line);
f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
573
574
575
  		if (initargs_found) {
  			saved_command_line[len++] = ' ';
  		} else {
131991620   Masami Hiramatsu   bootconfig: init:...
576
577
  			strcpy(saved_command_line + len, " -- ");
  			len += 4;
f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
578
  		}
131991620   Masami Hiramatsu   bootconfig: init:...
579
580
581
  
  		strcpy(saved_command_line + len, extra_init_args);
  	}
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
582
583
584
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
585
586
587
588
589
590
591
   * 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 ...
592
  static __initdata DECLARE_COMPLETION(kthreadd_done);
53c99bd66   Martin Schwidefsky   init: add arch_ca...
593
  noinline void __ref rest_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
594
  {
8fb12156b   Thomas Gleixner   init: Pin init ta...
595
  	struct task_struct *tsk;
73c279927   Eric W. Biederman   kthread: don't de...
596
  	int pid;
7db905e63   Paul E. McKenney   rcu: Move end of ...
597
  	rcu_scheduler_starting();
b433c3d45   Peter Zijlstra   init, sched: Fix ...
598
  	/*
971585692   Peter Zijlstra   init: Fix comment
599
  	 * We need to spawn init first so that it obtains pid 1, however
b433c3d45   Peter Zijlstra   init, sched: Fix ...
600
601
602
  	 * 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...
603
604
605
606
607
608
609
610
611
612
  	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
613
  	numa_default_policy();
73c279927   Eric W. Biederman   kthread: don't de...
614
  	pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
d11c563dd   Paul E. McKenney   sched: Use lockde...
615
  	rcu_read_lock();
5cd204550   Pavel Emelyanov   Deprecate find_ta...
616
  	kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
d11c563dd   Paul E. McKenney   sched: Use lockde...
617
  	rcu_read_unlock();
1c3c5eab1   Thomas Gleixner   sched/core: Enabl...
618
619
620
  
  	/*
  	 * Enable might_sleep() and smp_processor_id() checks.
c1a280b68   Thomas Gleixner   sched/preempt: Us...
621
  	 * They cannot be enabled earlier because with CONFIG_PREEMPTION=y
1c3c5eab1   Thomas Gleixner   sched/core: Enabl...
622
623
624
625
626
  	 * 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 ...
627
  	complete(&kthreadd_done);
f340c0d1a   Ingo Molnar   [PATCH] Tweak idl...
628
629
630
  
  	/*
  	 * The boot idle thread must execute schedule()
1df21055e   Ingo Molnar   sched: add init_i...
631
  	 * at least once to get things moving:
f340c0d1a   Ingo Molnar   [PATCH] Tweak idl...
632
  	 */
bd2f55361   Thomas Gleixner   sched/rt: Use sch...
633
  	schedule_preempt_disabled();
5bfb5d690   Nick Piggin   [PATCH] sched: di...
634
  	/* Call into cpu_idle with preempt disabled */
a1a04ec3c   Thomas Gleixner   idle: Provide a g...
635
  	cpu_startup_entry(CPUHP_ONLINE);
1df21055e   Ingo Molnar   sched: add init_i...
636
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
637
638
  
  /* Check for early params. */
ecc861705   Luis R. Rodriguez   module: add extra...
639
640
  static int __init do_early_param(char *param, char *val,
  				 const char *unused, void *arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641
  {
914dcaa84   Rusty Russell   param: make param...
642
  	const struct obs_kernel_param *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
643
644
  
  	for (p = __setup_start; p < __setup_end; p++) {
b1e4d20cb   Michal Schmidt   params: make dash...
645
  		if ((p->early && parameq(param, p->str)) ||
18a8bd949   Yinghai Lu   serial: convert e...
646
647
648
  		    (strcmp(param, "console") == 0 &&
  		     strcmp(p->str, "earlycon") == 0)
  		) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
649
  			if (p->setup_func(val) != 0)
ea676e846   Andrew Morton   init/main.c: conv...
650
651
  				pr_warn("Malformed early option '%s'
  ", param);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
652
653
654
655
656
  		}
  	}
  	/* We accept everything at this stage. */
  	return 0;
  }
13977091a   Magnus Damm   Driver Core: earl...
657
658
  void __init parse_early_options(char *cmdline)
  {
ecc861705   Luis R. Rodriguez   module: add extra...
659
660
  	parse_args("early options", cmdline, NULL, 0, 0, 0, NULL,
  		   do_early_param);
13977091a   Magnus Damm   Driver Core: earl...
661
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
662
663
664
  /* 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...
665
666
  	static int done __initdata;
  	static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
667
668
669
670
671
  
  	if (done)
  		return;
  
  	/* All fall through to do_early_param. */
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
672
  	strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
13977091a   Magnus Damm   Driver Core: earl...
673
  	parse_early_options(tmp_cmdline);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
674
675
  	done = 1;
  }
e7ff3a476   Thomas Gleixner   x86/amd: Check fo...
676
  void __init __weak arch_post_acpi_subsys_init(void) { }
839ad62e7   Benjamin Herrenschmidt   [POWERPC] Use __w...
677
  void __init __weak smp_setup_processor_id(void)
033ab7f8e   Andrew Morton   [PATCH] add smp_s...
678
679
  {
  }
eded09ccf   David Howells   FRV: gcc-4.1.2 al...
680
  # if THREAD_SIZE >= PAGE_SIZE
b235beea9   Linus Torvalds   Clarify naming of...
681
  void __init __weak thread_stack_cache_init(void)
8c9843e57   Benjamin Herrenschmidt   [POWERPC] Add thr...
682
683
  {
  }
eded09ccf   David Howells   FRV: gcc-4.1.2 al...
684
  #endif
8c9843e57   Benjamin Herrenschmidt   [POWERPC] Add thr...
685

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

4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
690
691
  bool initcall_debug;
  core_param(initcall_debug, initcall_debug, bool, 0644);
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
692
693
  
  #ifdef TRACEPOINTS_ENABLED
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
694
  static void __init initcall_debug_enable(void);
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
695
696
697
698
699
  #else
  static inline void initcall_debug_enable(void)
  {
  }
  #endif
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
700

23a5c8cb7   Alexander Potapenko   mm: init: report ...
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
  /* 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...
725
726
727
728
729
  /*
   * Set up kernel memory allocators
   */
  static void __init mm_init(void)
  {
eefa864b7   Joonsoo Kim   mm/page_ext: resu...
730
731
732
733
734
  	/*
  	 * page_ext requires contiguous pages,
  	 * bigger than MAX_ORDER unless SPARSEMEM.
  	 */
  	page_ext_init_flatmem();
8e57f8acb   Vlastimil Babka   mm, debug_pageall...
735
  	init_debug_pagealloc();
23a5c8cb7   Alexander Potapenko   mm: init: report ...
736
  	report_meminit();
444f478f6   Pekka Enberg   init: introduce m...
737
738
  	mem_init();
  	kmem_cache_init();
c56658681   Catalin Marinas   mm: kmemleak: use...
739
  	kmemleak_init();
b35f1819a   Kirill A. Shutemov   mm: create a sepa...
740
  	pgtable_init();
a9ee3a63d   Qian Cai   debugobjects: cal...
741
  	debug_objects_mem_init();
444f478f6   Pekka Enberg   init: introduce m...
742
  	vmalloc_init();
0ddab1d2e   Toshi Kani   lib/ioremap.c: ad...
743
  	ioremap_huge_init();
613e396bc   Thomas Gleixner   init: Invoke init...
744
745
  	/* Should be run before the first non-init thread is created */
  	init_espfix_bsp();
aa8c6248f   Thomas Gleixner   x86/mm/pti: Add i...
746
747
  	/* Should be run after espfix64 is set up. */
  	pti_init();
444f478f6   Pekka Enberg   init: introduce m...
748
  }
53c99bd66   Martin Schwidefsky   init: add arch_ca...
749
750
751
752
  void __init __weak arch_call_rest_init(void)
  {
  	rest_init();
  }
722a9f929   Andi Kleen   asmlinkage: Add e...
753
  asmlinkage __visible void __init start_kernel(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
754
  {
dd4d9fecb   Fabian Frederick   init/main.c: code...
755
756
  	char *command_line;
  	char *after_dashes;
033ab7f8e   Andrew Morton   [PATCH] add smp_s...
757

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

ddbcc7e8e   Paul Menage   Task Control Grou...
762
  	cgroup_init_early();
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
763
764
  
  	local_irq_disable();
2ce802f62   Tejun Heo   lockdep: Move ear...
765
  	early_boot_irqs_disabled = true;
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
766

1b3b3b49b   Viresh Kumar   init/main: proper...
767
768
769
770
  	/*
  	 * Interrupts are still disabled. Do necessary setups, then
  	 * enable them.
  	 */
44fd22992   Stas Sergeev   [PATCH] Register ...
771
  	boot_cpu_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
772
  	page_address_init();
ea676e846   Andrew Morton   init/main.c: conv...
773
  	pr_notice("%s", linux_banner);
e6b1db98c   Matthew Garrett   security: Support...
774
  	early_security_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
775
  	setup_arch(&command_line);
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
776
  	setup_boot_config(command_line);
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
777
  	setup_command_line(command_line);
e0982e90c   Mike Travis   init: move setup ...
778
  	setup_nr_cpu_ids();
d6647bdf9   Tejun Heo   init: set nr_cpu_...
779
  	setup_per_cpu_areas();
44fd22992   Stas Sergeev   [PATCH] Register ...
780
  	smp_prepare_boot_cpu();	/* arch-specific boot-cpu hooks */
b5b1404d0   Linus Torvalds   init: rename and ...
781
  	boot_cpu_hotplug_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
782

72675e131   Michal Hocko   mm, memory_hotplu...
783
  	build_all_zonelists(NULL);
83b519e8b   Pekka Enberg   slab: setup alloc...
784
  	page_alloc_init();
51887d03a   Masami Hiramatsu   bootconfig: init:...
785
786
  	pr_notice("Kernel command line: %s
  ", saved_command_line);
6041186a3   Dan Williams   init: initialize ...
787
788
  	/* parameters may set static keys */
  	jump_label_init();
83b519e8b   Pekka Enberg   slab: setup alloc...
789
  	parse_early_param();
51e158c12   Rusty Russell   param: hand argum...
790
791
792
  	after_dashes = parse_args("Booting kernel",
  				  static_command_line, __start___param,
  				  __stop___param - __start___param,
ecc861705   Luis R. Rodriguez   module: add extra...
793
  				  -1, -1, NULL, &unknown_bootoption);
3438cf549   Daniel Thompson   param: fix crash ...
794
  	if (!IS_ERR_OR_NULL(after_dashes))
51e158c12   Rusty Russell   param: hand argum...
795
  		parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
ecc861705   Luis R. Rodriguez   module: add extra...
796
  			   NULL, set_init_arg);
131991620   Masami Hiramatsu   bootconfig: init:...
797
798
799
  	if (extra_init_args)
  		parse_args("Setting extra init args", extra_init_args,
  			   NULL, 0, -1, -1, NULL, set_init_arg);
97ce2c88f   Jeremy Fitzhardinge   jump-label: initi...
800

83b519e8b   Pekka Enberg   slab: setup alloc...
801
802
803
804
  	/*
  	 * These use large bootmem allocations and must precede
  	 * kmem_cache_init()
  	 */
162a7e750   Mike Travis   printk: allocate ...
805
  	setup_log_buf(0);
83b519e8b   Pekka Enberg   slab: setup alloc...
806
807
808
  	vfs_caches_init_early();
  	sort_main_extable();
  	trap_init();
444f478f6   Pekka Enberg   init: introduce m...
809
  	mm_init();
de03c72cf   KOSAKI Motohiro   mm: convert mm->c...
810

f631718de   Steven Rostedt (VMware)   ftrace: Move ftra...
811
  	ftrace_init();
e725c731e   Steven Rostedt (VMware)   tracing: Split tr...
812
813
  	/* trace_printk can be enabled here */
  	early_trace_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
814
815
816
817
818
819
820
821
822
823
824
  	/*
  	 * 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...
825
826
827
  	if (WARN(!irqs_disabled(),
  		 "Interrupts were enabled *very* early, fixing it
  "))
c4a68306b   Ard van Breemen   [PATCH] start_ker...
828
  		local_irq_disable();
0a835c4f0   Matthew Wilcox   Reimplement IDR a...
829
  	radix_tree_init();
3347fa092   Tejun Heo   workqueue: make w...
830
831
  
  	/*
7d229c668   Tal Shorer   main: kernel_star...
832
833
834
835
836
837
  	 * 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...
838
839
840
841
842
  	 * 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
843
  	rcu_init();
5f893b263   Steven Rostedt (Red Hat)   tracing: Move ena...
844

e725c731e   Steven Rostedt (VMware)   tracing: Split tr...
845
  	/* Trace events are available after this */
5f893b263   Steven Rostedt (Red Hat)   tracing: Move ena...
846
  	trace_init();
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
847
848
  	if (initcall_debug)
  		initcall_debug_enable();
65f382fd0   Frederic Weisbecker   context_tracking:...
849
  	context_tracking_init();
0b8f1efad   Yinghai Lu   sparse irq_desc[]...
850
851
  	/* init some links before init_ISA_irqs() */
  	early_irq_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
852
  	init_IRQ();
ad2b13536   Thomas Gleixner   tick: Call tick_i...
853
  	tick_init();
d6dd50e07   Linus Torvalds   Merge branch 'cor...
854
  	rcu_init_nohz();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
855
  	init_timers();
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
856
  	hrtimers_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
857
  	softirq_init();
ad596171e   John Stultz   [PATCH] Time: Use...
858
  	timekeeping_init();
d55535232   Kees Cook   random: move rand...
859
860
861
862
863
864
865
866
867
868
869
870
871
  
  	/*
  	 * 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...
872
  	time_init();
f92bac3b1   Sergey Senozhatsky   printk: rename nm...
873
  	printk_safe_init();
9e6302056   Stephane Eranian   perf: Use hrtimer...
874
  	perf_event_init();
93e028148   Heiko Carstens   [PATCH] lockdep: ...
875
  	profile_init();
d8ad7d112   Takao Indoh   generic-ipi: Fix ...
876
  	call_function_init();
f91eb62f7   Steven Rostedt   init: scream bloo...
877
878
  	WARN(!irqs_disabled(), "Interrupts were enabled early
  ");
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
879

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

7e85ee0c1   Pekka Enberg   slab,slub: don't ...
883
  	kmem_cache_init_late();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
884
885
886
887
888
889
890
891
  
  	/*
  	 * 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...
892
893
  		panic("Too many boot %s vars at `%s'", panic_later,
  		      panic_param);
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
894

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

9a11b49a8   Ingo Molnar   [PATCH] lockdep: ...
897
898
899
900
901
902
  	/*
  	 * 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...
903
904
905
906
907
908
909
  	/*
  	 * 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
910
911
  #ifdef CONFIG_BLK_DEV_INITRD
  	if (initrd_start && !initrd_below_start_ok &&
bd673c7c3   Geert Uytterhoeven   initrd: cast `ini...
912
  	    page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {
ea676e846   Andrew Morton   init/main.c: conv...
913
914
  		pr_crit("initrd overwritten (0x%08lx < 0x%08lx) - disabling it.
  ",
bd673c7c3   Geert Uytterhoeven   initrd: cast `ini...
915
916
  		    page_to_pfn(virt_to_page((void *)initrd_start)),
  		    min_low_pfn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
917
918
919
  		initrd_start = 0;
  	}
  #endif
e7c8d5c99   Christoph Lameter   [PATCH] node loca...
920
  	setup_per_cpu_pageset();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
921
  	numa_policy_init();
9c71206d0   Dou Liyang   ACPI/init: Invoke...
922
  	acpi_early_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
923
924
  	if (late_time_init)
  		late_time_init();
857baa87b   Pavel Tatashin   sched/clock: Enab...
925
  	sched_clock_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
926
  	calibrate_delay();
95846ecf9   Gargi Sharma   pid: replace pid ...
927
  	pid_idr_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
928
  	anon_vma_init();
11520e5e7   Linus Torvalds   Revert "x86-64/ef...
929
  #ifdef CONFIG_X86
83e681897   Matt Fleming   efi: Make 'efi_en...
930
  	if (efi_enabled(EFI_RUNTIME_SERVICES))
11520e5e7   Linus Torvalds   Revert "x86-64/ef...
931
932
  		efi_enter_virtual_mode();
  #endif
b235beea9   Linus Torvalds   Clarify naming of...
933
  	thread_stack_cache_init();
d84f4f992   David Howells   CRED: Inaugurate ...
934
  	cred_init();
ff691f6e0   Heinrich Schuchardt   kernel/fork.c: ne...
935
  	fork_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
936
  	proc_caches_init();
3ea056c50   Alexey Dobriyan   uts: create "stru...
937
  	uts_ns_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
938
  	buffer_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
939
940
  	key_init();
  	security_init();
0b4b3827d   Jason Wessel   x86, kgdb, init: ...
941
  	dbg_late_init();
4248b0da4   Mel Gorman   fs, file table: r...
942
  	vfs_caches_init();
629060270   Nicholas Piggin   mm: add PageWaite...
943
  	pagecache_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
944
  	signals_init();
096523203   Alexey Dobriyan   seq_file: allocat...
945
  	seq_file_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
946
  	proc_root_init();
e149ed2b8   Al Viro   take the targets ...
947
  	nsfs_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
948
  	cpuset_init();
695df2132   Zefan Li   cpuset: initializ...
949
  	cgroup_init();
c757249af   Shailabh Nagar   [PATCH] per-task-...
950
  	taskstats_init_early();
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
951
  	delayacct_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
952

4fc19708b   Nadav Amit   x86/alternatives:...
953
  	poking_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
954
  	check_bugs();
b064a8fa7   Rafael J. Wysocki   ACPI / init: Swit...
955
  	acpi_subsystem_init();
e7ff3a476   Thomas Gleixner   x86/amd: Check fo...
956
  	arch_post_acpi_subsys_init();
6ae6996a4   Feng Tang   SFI: add platform...
957
  	sfi_init_late();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
958
959
  
  	/* Do the rest non-__init'ed, we're now alive */
53c99bd66   Martin Schwidefsky   init: add arch_ca...
960
  	arch_call_rest_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
961
  }
b99b87f70   Peter Oberparleiter   kernel: construct...
962
963
964
965
  /* 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 ...
966
  	ctor_fn_t *fn = (ctor_fn_t *) __ctors_start;
b99b87f70   Peter Oberparleiter   kernel: construct...
967

196a15b4e   H Hartley Sweeten   init/main.c: fix ...
968
969
  	for (; fn < (ctor_fn_t *) __ctors_end; fn++)
  		(*fn)();
b99b87f70   Peter Oberparleiter   kernel: construct...
970
971
  #endif
  }
7b0b73d76   Prarit Bhargava   init/main.c: add ...
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
  #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...
991
992
  			entry = memblock_alloc(sizeof(*entry),
  					       SMP_CACHE_BYTES);
f5c7310ac   Mike Rapoport   init/main: add ch...
993
994
995
996
  			if (!entry)
  				panic("%s: Failed to allocate %zu bytes
  ",
  				      __func__, sizeof(*entry));
7e1c4e279   Mike Rapoport   memblock: stop us...
997
998
  			entry->buf = memblock_alloc(strlen(str_entry) + 1,
  						    SMP_CACHE_BYTES);
f5c7310ac   Mike Rapoport   init/main: add ch...
999
1000
1001
1002
  			if (!entry->buf)
  				panic("%s: Failed to allocate %zu bytes
  ",
  				      __func__, strlen(str_entry) + 1);
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
  			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 ...
1013
  	struct blacklist_entry *entry;
c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
1014
  	char fn_name[KSYM_SYMBOL_LEN];
0fd5ed8d8   Rasmus Villemoes   init/main.c: fix ...
1015
  	unsigned long addr;
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1016

c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
1017
  	if (list_empty(&blacklisted_initcalls))
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1018
  		return false;
0fd5ed8d8   Rasmus Villemoes   init/main.c: fix ...
1019
1020
  	addr = (unsigned long) dereference_function_descriptor(fn);
  	sprint_symbol_no_offset(fn_name, addr);
c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
1021

841c06d71   Prarit Bhargava   init: allow black...
1022
1023
1024
1025
1026
  	/*
  	 * 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 ...
1027
  	list_for_each_entry(entry, &blacklisted_initcalls, next) {
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1028
1029
1030
  		if (!strcmp(fn_name, entry->buf)) {
  			pr_debug("initcall %s blacklisted
  ", fn_name);
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1031
1032
1033
  			return true;
  		}
  	}
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
  	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...
1050
1051
  static __init_or_module void
  trace_initcall_start_cb(void *data, initcall_t fn)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1052
  {
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1053
  	ktime_t *calltime = (ktime_t *)data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1054

d75f773c8   Sakari Ailus   treewide: Switch ...
1055
1056
  	printk(KERN_DEBUG "calling  %pS @ %i
  ", fn, task_pid_nr(current));
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1057
1058
1059
1060
1061
1062
1063
1064
1065
  	*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 ...
1066
  	rettime = ktime_get();
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1067
  	delta = ktime_sub(rettime, *calltime);
22c5c03b4   Kevin Winchester   init/main.c: fix ...
1068
  	duration = (unsigned long long) ktime_to_ns(delta) >> 10;
d75f773c8   Sakari Ailus   treewide: Switch ...
1069
1070
  	printk(KERN_DEBUG "initcall %pS returned %d after %lld usecs
  ",
ea676e846   Andrew Morton   init/main.c: conv...
1071
  		 fn, ret, duration);
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1072
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1073

4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1074
  static ktime_t initcall_calltime;
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
1075
  #ifdef TRACEPOINTS_ENABLED
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
  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 ...
1086
  }
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
  # 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 ...
1103

e44612713   Kevin Winchester   init/main.c: mark...
1104
  int __init_or_module do_one_initcall(initcall_t fn)
22c5c03b4   Kevin Winchester   init/main.c: fix ...
1105
1106
  {
  	int count = preempt_count();
ff1c8fac8   Steven Rostedt   init: remove perm...
1107
  	char msgbuf[64];
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1108
  	int ret;
22c5c03b4   Kevin Winchester   init/main.c: fix ...
1109

7b0b73d76   Prarit Bhargava   init/main.c: add ...
1110
1111
  	if (initcall_blacklisted(fn))
  		return -EPERM;
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
1112
  	do_trace_initcall_start(fn);
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1113
  	ret = fn();
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
1114
  	do_trace_initcall_finish(fn, ret);
8f0c45cdf   Ingo Molnar   enhance initcall_...
1115

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

e0df154f4   Linus Torvalds   Split up 'do_init...
1118
  	if (preempt_count() != count) {
bf5d770bd   Steven Rostedt   init: Do not warn...
1119
  		sprintf(msgbuf, "preemption imbalance ");
4a2b4b222   Peter Zijlstra   sched: Introduce ...
1120
  		preempt_count_set(count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1121
  	}
e0df154f4   Linus Torvalds   Split up 'do_init...
1122
  	if (irqs_disabled()) {
a76bfd0da   Cyrill Gorcunov   initcalls: Fix m6...
1123
  		strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
e0df154f4   Linus Torvalds   Split up 'do_init...
1124
1125
  		local_irq_enable();
  	}
d75f773c8   Sakari Ailus   treewide: Switch ...
1126
1127
  	WARN(msgbuf[0], "initcall %pS returned with %s
  ", fn, msgbuf);
59f9415ff   Arjan van de Ven   modules: extend i...
1128

38addce8b   Emese Revfy   gcc-plugins: Add ...
1129
  	add_latent_entropy();
30dbb20e6   Américo Wang   tracing: Remove b...
1130
  	return ret;
e0df154f4   Linus Torvalds   Split up 'do_init...
1131
  }
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
  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...
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
  	__initcall0_start,
  	__initcall1_start,
  	__initcall2_start,
  	__initcall3_start,
  	__initcall4_start,
  	__initcall5_start,
  	__initcall6_start,
  	__initcall7_start,
  	__initcall_end,
  };
96263d286   Jim Cromie   init: add comment...
1154
  /* Keep these in sync with initcalls in include/linux/init.h */
7c8f71935   Alexey Dobriyan   init/main.c: make...
1155
  static const char *initcall_level_names[] __initdata = {
a6fb6012e   Steven Rostedt (VMware)   init: Fix initcal...
1156
  	"pure",
9fb48c744   Jim Cromie   params: add 3rd a...
1157
1158
1159
1160
1161
1162
1163
  	"core",
  	"postcore",
  	"arch",
  	"subsys",
  	"fs",
  	"device",
  	"late",
026cee008   Pawel Moll   params: <level>_i...
1164
  };
7e2762e1d   Arvind Sankar   init/main.c: remo...
1165
1166
1167
1168
1169
  static int __init ignore_unknown_bootoption(char *param, char *val,
  			       const char *unused, void *arg)
  {
  	return 0;
  }
0068c92a9   Masami Hiramatsu   init/main.c: Allo...
1170
  static void __init do_initcall_level(int level, char *command_line)
e0df154f4   Linus Torvalds   Split up 'do_init...
1171
  {
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1172
  	initcall_entry_t *fn;
e0df154f4   Linus Torvalds   Split up 'do_init...
1173

026cee008   Pawel Moll   params: <level>_i...
1174
  	parse_args(initcall_level_names[level],
0068c92a9   Masami Hiramatsu   init/main.c: Allo...
1175
  		   command_line, __start___param,
026cee008   Pawel Moll   params: <level>_i...
1176
1177
  		   __stop___param - __start___param,
  		   level, level,
7e2762e1d   Arvind Sankar   init/main.c: remo...
1178
  		   NULL, ignore_unknown_bootoption);
026cee008   Pawel Moll   params: <level>_i...
1179

4ee7c60de   Steven Rostedt (VMware)   init, tracing: Ad...
1180
  	trace_initcall_level(initcall_level_names[level]);
026cee008   Pawel Moll   params: <level>_i...
1181
  	for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1182
  		do_one_initcall(initcall_from_entry(fn));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1183
  }
026cee008   Pawel Moll   params: <level>_i...
1184
1185
1186
  static void __init do_initcalls(void)
  {
  	int level;
0068c92a9   Masami Hiramatsu   init/main.c: Allo...
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
  	size_t len = strlen(saved_command_line) + 1;
  	char *command_line;
  
  	command_line = kzalloc(len, GFP_KERNEL);
  	if (!command_line)
  		panic("%s: Failed to allocate %zu bytes
  ", __func__, len);
  
  	for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++) {
  		/* Parser modifies command_line, restore it each time */
  		strcpy(command_line, saved_command_line);
  		do_initcall_level(level, command_line);
  	}
026cee008   Pawel Moll   params: <level>_i...
1200

0068c92a9   Masami Hiramatsu   init/main.c: Allo...
1201
  	kfree(command_line);
026cee008   Pawel Moll   params: <level>_i...
1202
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1203
1204
1205
1206
1207
1208
1209
1210
1211
  /*
   * 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 ...
1212
  	cpuset_init_smp();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1213
  	driver_init();
b04c3afb2   Eric W. Biederman   [PATCH] sysctl: m...
1214
  	init_irq_proc();
b99b87f70   Peter Oberparleiter   kernel: construct...
1215
  	do_ctors();
d5767c535   Linus Torvalds   bootup: move 'use...
1216
  	usermodehelper_enable();
b0f84374b   wangyanqing   bootup: move 'use...
1217
  	do_initcalls();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1218
  }
7babe8db9   Eduard - Gabriel Munteanu   Full conversion t...
1219
  static void __init do_pre_smp_initcalls(void)
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
1220
  {
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1221
  	initcall_entry_t *fn;
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
1222

4ee7c60de   Steven Rostedt (VMware)   init, tracing: Ad...
1223
  	trace_initcall_level("early");
026cee008   Pawel Moll   params: <level>_i...
1224
  	for (fn = __initcall_start; fn < __initcall0_start; fn++)
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1225
  		do_one_initcall(initcall_from_entry(fn));
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
1226
  }
a74fb73c1   Al Viro   infrastructure fo...
1227
  static int run_init_process(const char *init_filename)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1228
  {
b88c50ac3   Arvind Sankar   init/main.c: log ...
1229
  	const char *const *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1230
  	argv_init[0] = init_filename;
3f5c15d8a   Paul Menzel   init/main.c: log ...
1231
1232
  	pr_info("Run %s as init process
  ", init_filename);
b88c50ac3   Arvind Sankar   init/main.c: log ...
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
  	pr_debug("  with arguments:
  ");
  	for (p = argv_init; *p; p++)
  		pr_debug("    %s
  ", *p);
  	pr_debug("  with environment:
  ");
  	for (p = envp_init; *p; p++)
  		pr_debug("    %s
  ", *p);
c4ad8f98b   Linus Torvalds   execve: use 'stru...
1243
  	return do_execve(getname_kernel(init_filename),
ae903caae   Al Viro   Bury the conditio...
1244
1245
  		(const char __user *const __user *)argv_init,
  		(const char __user *const __user *)envp_init);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1246
  }
ba24762bd   Michael Opdenacker   init: make init f...
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
  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...
1261
  static noinline void __init kernel_init_freeable(void);
d6b212380   Al Viro   make sure that we...
1262

0f5bf6d0a   Laura Abbott   arch: Rename CONF...
1263
  #if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
39290b389   AKASHI Takahiro   module: extend 'r...
1264
  bool rodata_enabled __ro_after_init = true;
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1265
1266
1267
1268
1269
  static int __init set_debug_rodata(char *str)
  {
  	return strtobool(str, &rodata_enabled);
  }
  __setup("rodata=", set_debug_rodata);
39290b389   AKASHI Takahiro   module: extend 'r...
1270
  #endif
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1271

0f5bf6d0a   Laura Abbott   arch: Rename CONF...
1272
  #ifdef CONFIG_STRICT_KERNEL_RWX
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1273
1274
  static void mark_readonly(void)
  {
2959a5f72   Jinbum Park   mm: add arch-inde...
1275
  	if (rodata_enabled) {
ae646f0b9   Jeffrey Hugo   init: fix false p...
1276
  		/*
ba1803142   Paul E. McKenney   main: Replace rcu...
1277
1278
  		 * 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...
1279
1280
1281
  		 * flushed so that we don't hit false positives looking for
  		 * insecure pages which are W+X.
  		 */
ba1803142   Paul E. McKenney   main: Replace rcu...
1282
  		rcu_barrier();
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1283
  		mark_rodata_ro();
2959a5f72   Jinbum Park   mm: add arch-inde...
1284
1285
  		rodata_test();
  	} else
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1286
1287
1288
  		pr_info("Kernel memory protection disabled.
  ");
  }
f596ded1a   Christophe Leroy   init/main.c: fix ...
1289
1290
1291
1292
1293
1294
  #elif defined(CONFIG_ARCH_HAS_STRICT_KERNEL_RWX)
  static inline void mark_readonly(void)
  {
  	pr_warn("Kernel memory protection not selected by kernel config.
  ");
  }
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1295
1296
1297
1298
1299
1300
1301
  #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...
1302
1303
  void __weak free_initmem(void)
  {
f40399992   Mike Rapoport   init: free_initme...
1304
  	free_initmem_default(POISON_FREE_INITMEM);
997aef68a   Mike Rapoport   init: provide a g...
1305
  }
d6b212380   Al Viro   make sure that we...
1306
  static int __ref kernel_init(void *unused)
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1307
  {
ba24762bd   Michael Opdenacker   init: make init f...
1308
  	int ret;
d6b212380   Al Viro   make sure that we...
1309
  	kernel_init_freeable();
22a9d6456   Arjan van de Ven   async: Asynchrono...
1310
1311
  	/* need to finish all async __init code before freeing the memory */
  	async_synchronize_full();
b80f0f6c9   Steven Rostedt (VMware)   ftrace: Have init...
1312
  	ftrace_free_init_mem();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1313
  	free_initmem();
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1314
  	mark_readonly();
b976690f5   Joerg Roedel   x86/mm/pti: Intro...
1315
1316
1317
1318
1319
1320
  
  	/*
  	 * Kernel mappings are now finalized - update the userspace page-table
  	 * to finalize PTI.
  	 */
  	pti_finalize();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1321
1322
  	system_state = SYSTEM_RUNNING;
  	numa_default_policy();
967dcb8fe   Paul E. McKenney   rcu: Wire up rcu_...
1323
  	rcu_end_inkernel_boot();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1324
  	if (ramdisk_execute_command) {
ba24762bd   Michael Opdenacker   init: make init f...
1325
1326
  		ret = run_init_process(ramdisk_execute_command);
  		if (!ret)
a74fb73c1   Al Viro   infrastructure fo...
1327
  			return 0;
ba24762bd   Michael Opdenacker   init: make init f...
1328
1329
1330
  		pr_err("Failed to execute %s (error %d)
  ",
  		       ramdisk_execute_command, ret);
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1331
1332
1333
1334
1335
1336
1337
1338
1339
  	}
  
  	/*
  	 * 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...
1340
1341
  		ret = run_init_process(execute_command);
  		if (!ret)
a74fb73c1   Al Viro   infrastructure fo...
1342
  			return 0;
6ef4536e2   Andy Lutomirski   init: allow CONFI...
1343
1344
  		panic("Requested init %s failed (error %d).",
  		      execute_command, ret);
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1345
  	}
ba24762bd   Michael Opdenacker   init: make init f...
1346
1347
1348
1349
  	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...
1350
  		return 0;
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1351

ba24762bd   Michael Opdenacker   init: make init f...
1352
  	panic("No working init found.  Try passing init= option to kernel. "
8c27ceff3   Mauro Carvalho Chehab   docs: fix locatio...
1353
  	      "See Linux Documentation/admin-guide/init.rst for guidance.");
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1354
  }
b49a733d6   Dominik Brodowski   init: unify openi...
1355
1356
  void console_on_rootfs(void)
  {
74f1a2991   Dominik Brodowski   Revert "fs: remov...
1357
1358
1359
1360
  	/* Open the /dev/console as stdin, this should never fail */
  	if (ksys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
  		pr_err("Warning: unable to open an initial console.
  ");
b49a733d6   Dominik Brodowski   init: unify openi...
1361

74f1a2991   Dominik Brodowski   Revert "fs: remov...
1362
1363
1364
  	/* create stdout/stderr */
  	(void) ksys_dup(0);
  	(void) ksys_dup(0);
b49a733d6   Dominik Brodowski   init: unify openi...
1365
  }
f80b0c904   Vineet Gupta   Ensure that kerne...
1366
  static noinline void __init kernel_init_freeable(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1367
  {
b433c3d45   Peter Zijlstra   init, sched: Fix ...
1368
1369
1370
1371
  	/*
  	 * Wait until kthreadd is all set-up.
  	 */
  	wait_for_completion(&kthreadd_done);
31a67102f   Linus Torvalds   Fix blocking allo...
1372
1373
1374
  
  	/* Now the scheduler is fully set up and can do blocking allocations */
  	gfp_allowed_mask = __GFP_BITS_MASK;
58568d2a8   Miao Xie   cpuset,mm: update...
1375
1376
1377
  	/*
  	 * init can allocate pages on any node
  	 */
3c466d46a   Lai Jiangshan   init: use N_MEMOR...
1378
  	set_mems_allowed(node_states[N_MEMORY]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1379

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

3347fa092   Tejun Heo   workqueue: make w...
1383
  	workqueue_init();
597b7305d   Michal Hocko   mm: move mm_percp...
1384
  	init_mm_internals();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1385
  	do_pre_smp_initcalls();
004417a6d   Peter Zijlstra   perf, arch: Clean...
1386
  	lockup_detector_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1387

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1388
1389
  	smp_init();
  	sched_init_smp();
0e1cc95b4   Mel Gorman   mm: meminit: fini...
1390
  	page_alloc_init_late();
2f1ee0913   Qian Cai   Revert "mm: use e...
1391
1392
  	/* Initialize page ext after all struct pages are initialized. */
  	page_ext_init();
0e1cc95b4   Mel Gorman   mm: meminit: fini...
1393

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1394
  	do_basic_setup();
b49a733d6   Dominik Brodowski   init: unify openi...
1395
  	console_on_rootfs();
2bd3a997b   Eric W. Biederman   init: Open /dev/c...
1396

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1397
1398
1399
1400
  	/*
  	 * check if there is an early userspace init.  If yes, let it do all
  	 * the work
  	 */
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
1401
1402
1403
  
  	if (!ramdisk_execute_command)
  		ramdisk_execute_command = "/init";
cbfe20f56   Dominik Brodowski   fs: add do_facces...
1404
1405
  	if (ksys_access((const char __user *)
  			ramdisk_execute_command, 0) != 0) {
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
1406
  		ramdisk_execute_command = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1407
  		prepare_namespace();
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
1408
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1409
1410
1411
1412
1413
  
  	/*
  	 * 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...
1414
1415
1416
  	 *
  	 * rootfs is available now, try loading the public keys
  	 * and default modules
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1417
  	 */
bb813f4c9   Tejun Heo   init, block: try ...
1418

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