Blame view

init/main.c 37.3 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>
82d083ab6   Masami Hiramatsu   kprobes: tracing/...
34
  #include <linux/kprobes.h>
db64fe022   Nick Piggin   mm: rewrite vmap ...
35
  #include <linux/vmalloc.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
  #include <linux/kernel_stat.h>
d7cd56111   Rusty Russell   [PATCH] i386: cpu...
37
  #include <linux/start_kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
  #include <linux/security.h>
3d4422332   Jens Axboe   Add generic helpe...
39
  #include <linux/smp.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
42
43
44
45
46
  #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...
47
  #include <linux/cgroup.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
  #include <linux/efi.h>
906568c9c   Thomas Gleixner   [PATCH] tick-mana...
49
  #include <linux/tick.h>
786340614   Frederic Weisbecker   sched/isolation: ...
50
  #include <linux/sched/isolation.h>
6168a702a   Andrew Morton   [PATCH] Declare i...
51
  #include <linux/interrupt.h>
c757249af   Shailabh Nagar   [PATCH] per-task-...
52
  #include <linux/taskstats_kern.h>
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
53
  #include <linux/delayacct.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
  #include <linux/unistd.h>
3ea056c50   Alexey Dobriyan   uts: create "stru...
55
  #include <linux/utsname.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
  #include <linux/rmap.h>
  #include <linux/mempolicy.h>
  #include <linux/key.h>
b6cd0b772   Adrian Bunk   [PATCH] fs/buffer...
59
  #include <linux/buffer_head.h>
eefa864b7   Joonsoo Kim   mm/page_ext: resu...
60
  #include <linux/page_ext.h>
9a11b49a8   Ingo Molnar   [PATCH] lockdep: ...
61
  #include <linux/debug_locks.h>
3ac7fe5a4   Thomas Gleixner   infrastructure to...
62
  #include <linux/debugobjects.h>
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
63
  #include <linux/lockdep.h>
3c7b4e6b8   Catalin Marinas   kmemleak: Add the...
64
  #include <linux/kmemleak.h>
f1b192b11   Daniel Jordan   padata: initializ...
65
  #include <linux/padata.h>
84d737866   Sukadev Bhattiprolu   [PATCH] add child...
66
  #include <linux/pid_namespace.h>
4c002c978   Greg Kroah-Hartman   device.h: move 's...
67
  #include <linux/device/driver.h>
73c279927   Eric W. Biederman   kthread: don't de...
68
  #include <linux/kthread.h>
e6fe6649b   Adrian Bunk   sched: proper pro...
69
  #include <linux/sched.h>
1777e4635   Ingo Molnar   sched/headers: Pr...
70
  #include <linux/sched/init.h>
a1c9eea9e   Adrian Bunk   proper prototype ...
71
  #include <linux/signal.h>
199f0ca51   Akinobu Mita   idr: create idr_l...
72
  #include <linux/idr.h>
0b4b3827d   Jason Wessel   x86, kgdb, init: ...
73
  #include <linux/kgdb.h>
68bf21aa1   Steven Rostedt   ftrace: mcount ca...
74
  #include <linux/ftrace.h>
22a9d6456   Arjan van de Ven   async: Asynchrono...
75
  #include <linux/async.h>
6ae6996a4   Feng Tang   SFI: add platform...
76
  #include <linux/sfi.h>
2b2af54a5   Kay Sievers   Driver Core: devt...
77
  #include <linux/shmem_fs.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
78
  #include <linux/slab.h>
24a24bb6f   Peter Zijlstra   perf: Move perf_e...
79
  #include <linux/perf_event.h>
a74fb73c1   Al Viro   infrastructure fo...
80
  #include <linux/ptrace.h>
aa8c6248f   Thomas Gleixner   x86/mm/pti: Add i...
81
  #include <linux/pti.h>
bb813f4c9   Tejun Heo   init, block: try ...
82
83
  #include <linux/blkdev.h>
  #include <linux/elevator.h>
5d2a4e91a   Pavel Tatashin   sched/clock: Move...
84
  #include <linux/sched/clock.h>
299300258   Ingo Molnar   sched/headers: Pr...
85
  #include <linux/sched/task.h>
68db0cf10   Ingo Molnar   sched/headers: Pr...
86
  #include <linux/sched/task_stack.h>
65f382fd0   Frederic Weisbecker   context_tracking:...
87
  #include <linux/context_tracking.h>
47d06e532   Theodore Ts'o   random: run rando...
88
  #include <linux/random.h>
7b0b73d76   Prarit Bhargava   init/main.c: add ...
89
  #include <linux/list.h>
c9cd2ce2b   Dmitry Kasatkin   integrity: provid...
90
  #include <linux/integrity.h>
e149ed2b8   Al Viro   take the targets ...
91
  #include <linux/proc_ns.h>
0ddab1d2e   Toshi Kani   lib/ioremap.c: ad...
92
  #include <linux/io.h>
39290b389   AKASHI Takahiro   module: extend 'r...
93
  #include <linux/cache.h>
2959a5f72   Jinbum Park   mm: add arch-inde...
94
  #include <linux/rodata_test.h>
333522447   Josh Poimboeuf   jump_label: Expli...
95
  #include <linux/jump_label.h>
ae67d58d0   Mathieu Malaterre   init/main.c: incl...
96
  #include <linux/mem_encrypt.h>
dfd402a4c   Marco Elver   kcsan: Add Kernel...
97
  #include <linux/kcsan.h>
eb9d7d390   Christoph Hellwig   init: add an init...
98
  #include <linux/init_syscalls.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
100
101
102
  
  #include <asm/io.h>
  #include <asm/bugs.h>
  #include <asm/setup.h>
a940199f2   Andi Kleen   [PATCH] x86_64: S...
103
  #include <asm/sections.h>
37b73c828   Arjan van de Ven   [PATCH] x86/x86_6...
104
  #include <asm/cacheflush.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105

4ee7c60de   Steven Rostedt (VMware)   init, tracing: Ad...
106
107
  #define CREATE_TRACE_POINTS
  #include <trace/events/initcall.h>
8c0d88498   Brendan Higgins   init: main: add K...
108
  #include <kunit/test.h>
aae5f662a   Sam Ravnborg   kbuild: whitelist...
109
  static int kernel_init(void *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
110
111
  
  extern void init_IRQ(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
  extern void radix_tree_init(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113

2ce802f62   Tejun Heo   lockdep: Move ear...
114
115
116
117
118
119
120
121
  /*
   * 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...
122
  enum system_states system_state __read_mostly;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
124
125
126
127
128
129
130
131
132
  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...
133
  void (*__initdata late_time_init)(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134

30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
135
136
137
138
139
140
  /* 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:...
141
142
  /* Untouched extra command line */
  static char *extra_command_line;
131991620   Masami Hiramatsu   bootconfig: init:...
143
144
  /* Extra init arguments */
  static char *extra_init_args;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145

f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
146
147
148
149
150
151
152
153
  #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
154
  static char *execute_command;
916db733d   Christoph Hellwig   init: initialize ...
155
  static char *ramdisk_execute_command = "/init";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156

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

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

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

de462e5f1   Masami Hiramatsu   bootconfig: Fix t...
257
258
259
260
261
262
  #ifdef CONFIG_BLK_DEV_INITRD
  static void * __init get_boot_config_from_initrd(u32 *_size, u32 *_csum)
  {
  	u32 size, csum;
  	char *data;
  	u32 *hdr;
50b8a7428   Masami Hiramatsu   bootconfig: Exten...
263
  	int i;
de462e5f1   Masami Hiramatsu   bootconfig: Fix t...
264
265
266
267
268
  
  	if (!initrd_end)
  		return NULL;
  
  	data = (char *)initrd_end - BOOTCONFIG_MAGIC_LEN;
50b8a7428   Masami Hiramatsu   bootconfig: Exten...
269
270
271
272
273
274
275
276
277
278
  	/*
  	 * Since Grub may align the size of initrd to 4, we must
  	 * check the preceding 3 bytes as well.
  	 */
  	for (i = 0; i < 4; i++) {
  		if (!memcmp(data, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN))
  			goto found;
  		data--;
  	}
  	return NULL;
de462e5f1   Masami Hiramatsu   bootconfig: Fix t...
279

50b8a7428   Masami Hiramatsu   bootconfig: Exten...
280
  found:
de462e5f1   Masami Hiramatsu   bootconfig: Fix t...
281
  	hdr = (u32 *)(data - 8);
24aed0945   Masami Hiramatsu   bootconfig: Load ...
282
283
  	size = le32_to_cpu(hdr[0]);
  	csum = le32_to_cpu(hdr[1]);
de462e5f1   Masami Hiramatsu   bootconfig: Fix t...
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
  
  	data = ((void *)hdr) - size;
  	if ((unsigned long)data < initrd_start) {
  		pr_err("bootconfig size %d is greater than initrd size %ld
  ",
  			size, initrd_end - initrd_start);
  		return NULL;
  	}
  
  	/* Remove bootconfig from initramfs/initrd */
  	initrd_end = (unsigned long)data;
  	if (_size)
  		*_size = size;
  	if (_csum)
  		*_csum = csum;
  
  	return data;
  }
  #else
  static void * __init get_boot_config_from_initrd(u32 *_size, u32 *_csum)
  {
  	return NULL;
  }
  #endif
7684b8582   Masami Hiramatsu   bootconfig: Load ...
308
  #ifdef CONFIG_BOOT_CONFIG
51887d03a   Masami Hiramatsu   bootconfig: init:...
309

a27026e95   Jason Yan   bootconfig: init:...
310
  static char xbc_namebuf[XBC_KEYLEN_MAX] __initdata;
51887d03a   Masami Hiramatsu   bootconfig: init:...
311
312
313
314
315
316
317
318
  
  #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;
51887d03a   Masami Hiramatsu   bootconfig: init:...
319
320
321
322
323
324
325
326
327
328
  	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);
88b913718   Masami Hiramatsu   bootconfig: Print...
329
330
331
332
333
  		if (!vnode) {
  			ret = snprintf(buf, rest(buf, end), "%s ", xbc_namebuf);
  			if (ret < 0)
  				return ret;
  			buf += ret;
51887d03a   Masami Hiramatsu   bootconfig: init:...
334
  			continue;
88b913718   Masami Hiramatsu   bootconfig: Print...
335
  		}
51887d03a   Masami Hiramatsu   bootconfig: init:...
336
  		xbc_array_for_each_value(vnode, val) {
88b913718   Masami Hiramatsu   bootconfig: Print...
337
338
  			ret = snprintf(buf, rest(buf, end), "%s=\"%s\" ",
  				       xbc_namebuf, val);
51887d03a   Masami Hiramatsu   bootconfig: init:...
339
340
341
  			if (ret < 0)
  				return ret;
  			buf += ret;
51887d03a   Masami Hiramatsu   bootconfig: init:...
342
  		}
51887d03a   Masami Hiramatsu   bootconfig: init:...
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
  	}
  
  	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;
  }
08d9e6864   Qiujun Huang   bootconfig: Mark ...
381
  static u32 boot_config_checksum(unsigned char *p, u32 size)
7684b8582   Masami Hiramatsu   bootconfig: Load ...
382
383
384
385
386
387
388
389
  {
  	u32 ret = 0;
  
  	while (size--)
  		ret += *p++;
  
  	return ret;
  }
f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
390
391
392
393
394
  static int __init bootconfig_params(char *param, char *val,
  				    const char *unused, void *arg)
  {
  	if (strcmp(param, "bootconfig") == 0) {
  		bootconfig_found = true;
f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
395
396
397
  	}
  	return 0;
  }
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
398
  static void __init setup_boot_config(const char *cmdline)
7684b8582   Masami Hiramatsu   bootconfig: Load ...
399
  {
f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
400
  	static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata;
89b74cac7   Masami Hiramatsu   tools/bootconfig:...
401
402
  	const char *msg;
  	int pos;
7684b8582   Masami Hiramatsu   bootconfig: Load ...
403
  	u32 size, csum;
477d08478   Masami Hiramatsu   bootconfig: Fix t...
404
  	char *data, *copy, *err;
a00574036   Masami Hiramatsu   bootconfig: Show ...
405
  	int ret;
7684b8582   Masami Hiramatsu   bootconfig: Load ...
406

611d0a95d   Masami Hiramatsu   bootconfig: Fix t...
407
  	/* Cut out the bootconfig data even if we have no bootconfig option */
de462e5f1   Masami Hiramatsu   bootconfig: Fix t...
408
  	data = get_boot_config_from_initrd(&size, &csum);
de462e5f1   Masami Hiramatsu   bootconfig: Fix t...
409

f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
410
  	strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
477d08478   Masami Hiramatsu   bootconfig: Fix t...
411
412
  	err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL,
  			 bootconfig_params);
f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
413

477d08478   Masami Hiramatsu   bootconfig: Fix t...
414
  	if (IS_ERR(err) || !bootconfig_found)
7684b8582   Masami Hiramatsu   bootconfig: Load ...
415
  		return;
477d08478   Masami Hiramatsu   bootconfig: Fix t...
416
417
418
  	/* parse_args() stops at '--' and returns an address */
  	if (err)
  		initargs_found = true;
611d0a95d   Masami Hiramatsu   bootconfig: Fix t...
419
420
421
422
423
  	if (!data) {
  		pr_err("'bootconfig' found on command line, but no bootconfig found
  ");
  		return;
  	}
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
424
425
426
427
  	if (size >= XBC_DATA_MAX) {
  		pr_err("bootconfig size %d greater than max size %d
  ",
  			size, XBC_DATA_MAX);
7684b8582   Masami Hiramatsu   bootconfig: Load ...
428
  		return;
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
429
  	}
7684b8582   Masami Hiramatsu   bootconfig: Load ...
430

7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
431
432
433
  	if (boot_config_checksum((unsigned char *)data, size) != csum) {
  		pr_err("bootconfig checksum failed
  ");
7684b8582   Masami Hiramatsu   bootconfig: Load ...
434
  		return;
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
435
  	}
7684b8582   Masami Hiramatsu   bootconfig: Load ...
436
437
438
  
  	copy = memblock_alloc(size + 1, SMP_CACHE_BYTES);
  	if (!copy) {
e241d14a8   Masami Hiramatsu   bootconfig: Use b...
439
440
  		pr_err("Failed to allocate memory for bootconfig
  ");
7684b8582   Masami Hiramatsu   bootconfig: Load ...
441
442
443
444
445
  		return;
  	}
  
  	memcpy(copy, data, size);
  	copy[size] = '\0';
89b74cac7   Masami Hiramatsu   tools/bootconfig:...
446
447
448
449
450
451
452
453
454
455
  	ret = xbc_init(copy, &msg, &pos);
  	if (ret < 0) {
  		if (pos < 0)
  			pr_err("Failed to init bootconfig: %s.
  ", msg);
  		else
  			pr_err("Failed to parse bootconfig: %s at %d.
  ",
  				msg, pos);
  	} else {
a00574036   Masami Hiramatsu   bootconfig: Show ...
456
457
  		pr_info("Load bootconfig: %d bytes %d nodes
  ", size, ret);
51887d03a   Masami Hiramatsu   bootconfig: init:...
458
459
  		/* keys starting with "kernel." are passed via cmdline */
  		extra_command_line = xbc_make_cmdline("kernel");
131991620   Masami Hiramatsu   bootconfig: init:...
460
461
  		/* Also, "init." keys are init arguments */
  		extra_init_args = xbc_make_cmdline("init");
51887d03a   Masami Hiramatsu   bootconfig: init:...
462
  	}
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
463
  	return;
7684b8582   Masami Hiramatsu   bootconfig: Load ...
464
  }
de462e5f1   Masami Hiramatsu   bootconfig: Fix t...
465

7684b8582   Masami Hiramatsu   bootconfig: Load ...
466
  #else
de462e5f1   Masami Hiramatsu   bootconfig: Fix t...
467
468
469
470
471
472
  
  static void __init setup_boot_config(const char *cmdline)
  {
  	/* Remove bootconfig data from initrd */
  	get_boot_config_from_initrd(NULL, NULL);
  }
d8a953ddd   Masami Hiramatsu   bootconfig: Set C...
473
474
475
  
  static int __init warn_bootconfig(char *str)
  {
36c6aa26e   Shaokun Zhang   bootconfig: Fix k...
476
477
  	pr_warn("WARNING: 'bootconfig' found on the kernel command line but CONFIG_BOOT_CONFIG is not set.
  ");
d8a953ddd   Masami Hiramatsu   bootconfig: Set C...
478
479
480
  	return 0;
  }
  early_param("bootconfig", warn_bootconfig);
7684b8582   Masami Hiramatsu   bootconfig: Load ...
481
  #endif
a99cd1125   Chris Metcalf   init: fix bug whe...
482
  /* Change NUL term back to "=", to make "param" the whole string. */
7e2762e1d   Arvind Sankar   init/main.c: remo...
483
  static void __init repair_env_string(char *param, char *val)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
484
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
485
486
487
488
489
490
491
  	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
492
493
494
  		} else
  			BUG();
  	}
a99cd1125   Chris Metcalf   init: fix bug whe...
495
  }
51e158c12   Rusty Russell   param: hand argum...
496
  /* Anything after -- gets handed straight to init. */
ecc861705   Luis R. Rodriguez   module: add extra...
497
498
  static int __init set_init_arg(char *param, char *val,
  			       const char *unused, void *arg)
51e158c12   Rusty Russell   param: hand argum...
499
500
501
502
503
  {
  	unsigned int i;
  
  	if (panic_later)
  		return 0;
7e2762e1d   Arvind Sankar   init/main.c: remo...
504
  	repair_env_string(param, val);
51e158c12   Rusty Russell   param: hand argum...
505
506
507
508
509
510
511
512
513
514
515
  
  	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...
516
517
518
519
  /*
   * 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...
520
521
  static int __init unknown_bootoption(char *param, char *val,
  				     const char *unused, void *arg)
a99cd1125   Chris Metcalf   init: fix bug whe...
522
  {
283900e82   Arvind Sankar   init/main.c: fix ...
523
  	size_t len = strlen(param);
7e2762e1d   Arvind Sankar   init/main.c: remo...
524
  	repair_env_string(param, val);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
525
526
527
528
  
  	/* Handle obsolete-style parameters */
  	if (obsolete_checksetup(param))
  		return 0;
f066a4f6d   Rusty Russell   param: don't comp...
529
  	/* Unused module parameter. */
283900e82   Arvind Sankar   init/main.c: fix ...
530
  	if (strnchr(param, len, '.'))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
531
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
532
533
534
535
536
537
538
539
540
  
  	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...
541
  				panic_later = "env";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
542
543
  				panic_param = param;
  			}
283900e82   Arvind Sankar   init/main.c: fix ...
544
  			if (!strncmp(param, envp_init[i], len+1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
545
546
547
548
549
550
551
552
  				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...
553
  				panic_later = "init";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
  				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...
578
579
580
581
582
583
584
585
586
587
588
  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
589
  #ifndef CONFIG_SMP
34db18a05   Amerigo Wang   smp: move smp set...
590
  static const unsigned int setup_max_cpus = NR_CPUS;
e0982e90c   Mike Travis   init: move setup ...
591
  static inline void setup_nr_cpu_ids(void) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
592
  static inline void smp_prepare_cpus(unsigned int maxcpus) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
593
594
595
  #endif
  
  /*
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
596
597
598
599
600
601
602
   * 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:...
603
  	size_t len, xlen = 0, ilen = 0;
f5c7310ac   Mike Rapoport   init/main: add ch...
604

51887d03a   Masami Hiramatsu   bootconfig: init:...
605
606
  	if (extra_command_line)
  		xlen = strlen(extra_command_line);
131991620   Masami Hiramatsu   bootconfig: init:...
607
608
  	if (extra_init_args)
  		ilen = strlen(extra_init_args) + 4; /* for " -- " */
f5c7310ac   Mike Rapoport   init/main: add ch...
609

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

131991620   Masami Hiramatsu   bootconfig: init:...
612
  	saved_command_line = memblock_alloc(len + ilen, SMP_CACHE_BYTES);
f5c7310ac   Mike Rapoport   init/main: add ch...
613
  	if (!saved_command_line)
131991620   Masami Hiramatsu   bootconfig: init:...
614
615
  		panic("%s: Failed to allocate %zu bytes
  ", __func__, len + ilen);
f5c7310ac   Mike Rapoport   init/main: add ch...
616
617
618
619
620
  
  	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:...
621
622
623
624
625
626
627
628
629
630
631
  	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:...
632
633
634
635
636
637
638
639
  
  	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...
640
641
642
  		if (initargs_found) {
  			saved_command_line[len++] = ' ';
  		} else {
131991620   Masami Hiramatsu   bootconfig: init:...
643
644
  			strcpy(saved_command_line + len, " -- ");
  			len += 4;
f61872bb5   Steven Rostedt (VMware)   bootconfig: Use p...
645
  		}
131991620   Masami Hiramatsu   bootconfig: init:...
646
647
648
  
  		strcpy(saved_command_line + len, extra_init_args);
  	}
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
649
650
651
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
652
653
654
655
656
657
658
   * 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 ...
659
  static __initdata DECLARE_COMPLETION(kthreadd_done);
53c99bd66   Martin Schwidefsky   init: add arch_ca...
660
  noinline void __ref rest_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
661
  {
8fb12156b   Thomas Gleixner   init: Pin init ta...
662
  	struct task_struct *tsk;
73c279927   Eric W. Biederman   kthread: don't de...
663
  	int pid;
7db905e63   Paul E. McKenney   rcu: Move end of ...
664
  	rcu_scheduler_starting();
b433c3d45   Peter Zijlstra   init, sched: Fix ...
665
  	/*
971585692   Peter Zijlstra   init: Fix comment
666
  	 * We need to spawn init first so that it obtains pid 1, however
b433c3d45   Peter Zijlstra   init, sched: Fix ...
667
668
669
  	 * 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...
670
671
672
673
674
675
676
677
678
679
  	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
680
  	numa_default_policy();
73c279927   Eric W. Biederman   kthread: don't de...
681
  	pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
d11c563dd   Paul E. McKenney   sched: Use lockde...
682
  	rcu_read_lock();
5cd204550   Pavel Emelyanov   Deprecate find_ta...
683
  	kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
d11c563dd   Paul E. McKenney   sched: Use lockde...
684
  	rcu_read_unlock();
1c3c5eab1   Thomas Gleixner   sched/core: Enabl...
685
686
687
  
  	/*
  	 * Enable might_sleep() and smp_processor_id() checks.
c1a280b68   Thomas Gleixner   sched/preempt: Us...
688
  	 * They cannot be enabled earlier because with CONFIG_PREEMPTION=y
1c3c5eab1   Thomas Gleixner   sched/core: Enabl...
689
690
691
692
693
  	 * 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 ...
694
  	complete(&kthreadd_done);
f340c0d1a   Ingo Molnar   [PATCH] Tweak idl...
695
696
697
  
  	/*
  	 * The boot idle thread must execute schedule()
1df21055e   Ingo Molnar   sched: add init_i...
698
  	 * at least once to get things moving:
f340c0d1a   Ingo Molnar   [PATCH] Tweak idl...
699
  	 */
bd2f55361   Thomas Gleixner   sched/rt: Use sch...
700
  	schedule_preempt_disabled();
5bfb5d690   Nick Piggin   [PATCH] sched: di...
701
  	/* Call into cpu_idle with preempt disabled */
a1a04ec3c   Thomas Gleixner   idle: Provide a g...
702
  	cpu_startup_entry(CPUHP_ONLINE);
1df21055e   Ingo Molnar   sched: add init_i...
703
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
704
705
  
  /* Check for early params. */
ecc861705   Luis R. Rodriguez   module: add extra...
706
707
  static int __init do_early_param(char *param, char *val,
  				 const char *unused, void *arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
708
  {
914dcaa84   Rusty Russell   param: make param...
709
  	const struct obs_kernel_param *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
710
711
  
  	for (p = __setup_start; p < __setup_end; p++) {
b1e4d20cb   Michal Schmidt   params: make dash...
712
  		if ((p->early && parameq(param, p->str)) ||
18a8bd949   Yinghai Lu   serial: convert e...
713
714
715
  		    (strcmp(param, "console") == 0 &&
  		     strcmp(p->str, "earlycon") == 0)
  		) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
716
  			if (p->setup_func(val) != 0)
ea676e846   Andrew Morton   init/main.c: conv...
717
718
  				pr_warn("Malformed early option '%s'
  ", param);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
719
720
721
722
723
  		}
  	}
  	/* We accept everything at this stage. */
  	return 0;
  }
13977091a   Magnus Damm   Driver Core: earl...
724
725
  void __init parse_early_options(char *cmdline)
  {
ecc861705   Luis R. Rodriguez   module: add extra...
726
727
  	parse_args("early options", cmdline, NULL, 0, 0, 0, NULL,
  		   do_early_param);
13977091a   Magnus Damm   Driver Core: earl...
728
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
729
730
731
  /* 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...
732
733
  	static int done __initdata;
  	static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
734
735
736
737
738
  
  	if (done)
  		return;
  
  	/* All fall through to do_early_param. */
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
739
  	strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
13977091a   Magnus Damm   Driver Core: earl...
740
  	parse_early_options(tmp_cmdline);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
741
742
  	done = 1;
  }
e7ff3a476   Thomas Gleixner   x86/amd: Check fo...
743
  void __init __weak arch_post_acpi_subsys_init(void) { }
839ad62e7   Benjamin Herrenschmidt   [POWERPC] Use __w...
744
  void __init __weak smp_setup_processor_id(void)
033ab7f8e   Andrew Morton   [PATCH] add smp_s...
745
746
  {
  }
eded09ccf   David Howells   FRV: gcc-4.1.2 al...
747
  # if THREAD_SIZE >= PAGE_SIZE
b235beea9   Linus Torvalds   Clarify naming of...
748
  void __init __weak thread_stack_cache_init(void)
8c9843e57   Benjamin Herrenschmidt   [POWERPC] Add thr...
749
750
  {
  }
eded09ccf   David Howells   FRV: gcc-4.1.2 al...
751
  #endif
8c9843e57   Benjamin Herrenschmidt   [POWERPC] Add thr...
752

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

4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
757
758
  bool initcall_debug;
  core_param(initcall_debug, initcall_debug, bool, 0644);
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
759
760
  
  #ifdef TRACEPOINTS_ENABLED
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
761
  static void __init initcall_debug_enable(void);
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
762
763
764
765
766
  #else
  static inline void initcall_debug_enable(void)
  {
  }
  #endif
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
767

23a5c8cb7   Alexander Potapenko   mm: init: report ...
768
769
770
771
  /* Report memory auto-initialization states for this boot. */
  static void __init report_meminit(void)
  {
  	const char *stack;
f0fe00d49   glider@google.com   security: allow u...
772
773
774
775
  	if (IS_ENABLED(CONFIG_INIT_STACK_ALL_PATTERN))
  		stack = "all(pattern)";
  	else if (IS_ENABLED(CONFIG_INIT_STACK_ALL_ZERO))
  		stack = "all(zero)";
23a5c8cb7   Alexander Potapenko   mm: init: report ...
776
  	else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL))
f0fe00d49   glider@google.com   security: allow u...
777
  		stack = "byref_all(zero)";
23a5c8cb7   Alexander Potapenko   mm: init: report ...
778
  	else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF))
f0fe00d49   glider@google.com   security: allow u...
779
  		stack = "byref(zero)";
23a5c8cb7   Alexander Potapenko   mm: init: report ...
780
  	else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_USER))
f0fe00d49   glider@google.com   security: allow u...
781
  		stack = "__user(zero)";
23a5c8cb7   Alexander Potapenko   mm: init: report ...
782
783
784
785
786
787
788
789
790
791
792
  	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...
793
794
795
796
797
  /*
   * Set up kernel memory allocators
   */
  static void __init mm_init(void)
  {
eefa864b7   Joonsoo Kim   mm/page_ext: resu...
798
799
800
801
802
  	/*
  	 * page_ext requires contiguous pages,
  	 * bigger than MAX_ORDER unless SPARSEMEM.
  	 */
  	page_ext_init_flatmem();
8e57f8acb   Vlastimil Babka   mm, debug_pageall...
803
  	init_debug_pagealloc();
23a5c8cb7   Alexander Potapenko   mm: init: report ...
804
  	report_meminit();
444f478f6   Pekka Enberg   init: introduce m...
805
806
  	mem_init();
  	kmem_cache_init();
c56658681   Catalin Marinas   mm: kmemleak: use...
807
  	kmemleak_init();
b35f1819a   Kirill A. Shutemov   mm: create a sepa...
808
  	pgtable_init();
a9ee3a63d   Qian Cai   debugobjects: cal...
809
  	debug_objects_mem_init();
444f478f6   Pekka Enberg   init: introduce m...
810
  	vmalloc_init();
0ddab1d2e   Toshi Kani   lib/ioremap.c: ad...
811
  	ioremap_huge_init();
613e396bc   Thomas Gleixner   init: Invoke init...
812
813
  	/* Should be run before the first non-init thread is created */
  	init_espfix_bsp();
aa8c6248f   Thomas Gleixner   x86/mm/pti: Add i...
814
815
  	/* Should be run after espfix64 is set up. */
  	pti_init();
444f478f6   Pekka Enberg   init: introduce m...
816
  }
53c99bd66   Martin Schwidefsky   init: add arch_ca...
817
818
819
820
  void __init __weak arch_call_rest_init(void)
  {
  	rest_init();
  }
f9409d58e   Andrey Konovalov   kasan, arm64: don...
821
  asmlinkage __visible void __init __no_sanitize_address start_kernel(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
822
  {
dd4d9fecb   Fabian Frederick   init/main.c: code...
823
824
  	char *command_line;
  	char *after_dashes;
033ab7f8e   Andrew Morton   [PATCH] add smp_s...
825

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

ddbcc7e8e   Paul Menage   Task Control Grou...
830
  	cgroup_init_early();
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
831
832
  
  	local_irq_disable();
2ce802f62   Tejun Heo   lockdep: Move ear...
833
  	early_boot_irqs_disabled = true;
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
834

1b3b3b49b   Viresh Kumar   init/main: proper...
835
836
837
838
  	/*
  	 * Interrupts are still disabled. Do necessary setups, then
  	 * enable them.
  	 */
44fd22992   Stas Sergeev   [PATCH] Register ...
839
  	boot_cpu_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
840
  	page_address_init();
ea676e846   Andrew Morton   init/main.c: conv...
841
  	pr_notice("%s", linux_banner);
e6b1db98c   Matthew Garrett   security: Support...
842
  	early_security_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
843
  	setup_arch(&command_line);
7495e0926   Steven Rostedt (VMware)   bootconfig: Only ...
844
  	setup_boot_config(command_line);
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
845
  	setup_command_line(command_line);
e0982e90c   Mike Travis   init: move setup ...
846
  	setup_nr_cpu_ids();
d6647bdf9   Tejun Heo   init: set nr_cpu_...
847
  	setup_per_cpu_areas();
44fd22992   Stas Sergeev   [PATCH] Register ...
848
  	smp_prepare_boot_cpu();	/* arch-specific boot-cpu hooks */
b5b1404d0   Linus Torvalds   init: rename and ...
849
  	boot_cpu_hotplug_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
850

72675e131   Michal Hocko   mm, memory_hotplu...
851
  	build_all_zonelists(NULL);
83b519e8b   Pekka Enberg   slab: setup alloc...
852
  	page_alloc_init();
51887d03a   Masami Hiramatsu   bootconfig: init:...
853
854
  	pr_notice("Kernel command line: %s
  ", saved_command_line);
6041186a3   Dan Williams   init: initialize ...
855
856
  	/* parameters may set static keys */
  	jump_label_init();
83b519e8b   Pekka Enberg   slab: setup alloc...
857
  	parse_early_param();
51e158c12   Rusty Russell   param: hand argum...
858
859
860
  	after_dashes = parse_args("Booting kernel",
  				  static_command_line, __start___param,
  				  __stop___param - __start___param,
ecc861705   Luis R. Rodriguez   module: add extra...
861
  				  -1, -1, NULL, &unknown_bootoption);
3438cf549   Daniel Thompson   param: fix crash ...
862
  	if (!IS_ERR_OR_NULL(after_dashes))
51e158c12   Rusty Russell   param: hand argum...
863
  		parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
ecc861705   Luis R. Rodriguez   module: add extra...
864
  			   NULL, set_init_arg);
131991620   Masami Hiramatsu   bootconfig: init:...
865
866
867
  	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...
868

83b519e8b   Pekka Enberg   slab: setup alloc...
869
870
871
872
  	/*
  	 * These use large bootmem allocations and must precede
  	 * kmem_cache_init()
  	 */
162a7e750   Mike Travis   printk: allocate ...
873
  	setup_log_buf(0);
83b519e8b   Pekka Enberg   slab: setup alloc...
874
875
876
  	vfs_caches_init_early();
  	sort_main_extable();
  	trap_init();
444f478f6   Pekka Enberg   init: introduce m...
877
  	mm_init();
de03c72cf   KOSAKI Motohiro   mm: convert mm->c...
878

f631718de   Steven Rostedt (VMware)   ftrace: Move ftra...
879
  	ftrace_init();
e725c731e   Steven Rostedt (VMware)   tracing: Split tr...
880
881
  	/* trace_printk can be enabled here */
  	early_trace_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
882
883
884
885
886
887
888
889
890
891
892
  	/*
  	 * 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...
893
894
895
  	if (WARN(!irqs_disabled(),
  		 "Interrupts were enabled *very* early, fixing it
  "))
c4a68306b   Ard van Breemen   [PATCH] start_ker...
896
  		local_irq_disable();
0a835c4f0   Matthew Wilcox   Reimplement IDR a...
897
  	radix_tree_init();
3347fa092   Tejun Heo   workqueue: make w...
898
899
  
  	/*
7d229c668   Tal Shorer   main: kernel_star...
900
901
902
903
904
905
  	 * 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...
906
907
908
909
910
  	 * 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
911
  	rcu_init();
5f893b263   Steven Rostedt (Red Hat)   tracing: Move ena...
912

e725c731e   Steven Rostedt (VMware)   tracing: Split tr...
913
  	/* Trace events are available after this */
5f893b263   Steven Rostedt (Red Hat)   tracing: Move ena...
914
  	trace_init();
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
915
916
  	if (initcall_debug)
  		initcall_debug_enable();
65f382fd0   Frederic Weisbecker   context_tracking:...
917
  	context_tracking_init();
0b8f1efad   Yinghai Lu   sparse irq_desc[]...
918
919
  	/* init some links before init_ISA_irqs() */
  	early_irq_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
920
  	init_IRQ();
ad2b13536   Thomas Gleixner   tick: Call tick_i...
921
  	tick_init();
d6dd50e07   Linus Torvalds   Merge branch 'cor...
922
  	rcu_init_nohz();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
923
  	init_timers();
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
924
  	hrtimers_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
925
  	softirq_init();
ad596171e   John Stultz   [PATCH] Time: Use...
926
  	timekeeping_init();
d55535232   Kees Cook   random: move rand...
927
928
929
930
931
932
933
934
935
936
937
938
939
  
  	/*
  	 * 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...
940
  	time_init();
9e6302056   Stephane Eranian   perf: Use hrtimer...
941
  	perf_event_init();
93e028148   Heiko Carstens   [PATCH] lockdep: ...
942
  	profile_init();
d8ad7d112   Takao Indoh   generic-ipi: Fix ...
943
  	call_function_init();
f91eb62f7   Steven Rostedt   init: scream bloo...
944
945
  	WARN(!irqs_disabled(), "Interrupts were enabled early
  ");
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
946

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

7e85ee0c1   Pekka Enberg   slab,slub: don't ...
950
  	kmem_cache_init_late();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
951
952
953
954
955
956
957
958
  
  	/*
  	 * 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...
959
960
  		panic("Too many boot %s vars at `%s'", panic_later,
  		      panic_param);
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
961

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

9a11b49a8   Ingo Molnar   [PATCH] lockdep: ...
964
965
966
967
968
969
  	/*
  	 * 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...
970
971
972
973
974
975
976
  	/*
  	 * 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
977
978
  #ifdef CONFIG_BLK_DEV_INITRD
  	if (initrd_start && !initrd_below_start_ok &&
bd673c7c3   Geert Uytterhoeven   initrd: cast `ini...
979
  	    page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {
ea676e846   Andrew Morton   init/main.c: conv...
980
981
  		pr_crit("initrd overwritten (0x%08lx < 0x%08lx) - disabling it.
  ",
bd673c7c3   Geert Uytterhoeven   initrd: cast `ini...
982
983
  		    page_to_pfn(virt_to_page((void *)initrd_start)),
  		    min_low_pfn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
984
985
986
  		initrd_start = 0;
  	}
  #endif
e7c8d5c99   Christoph Lameter   [PATCH] node loca...
987
  	setup_per_cpu_pageset();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
988
  	numa_policy_init();
9c71206d0   Dou Liyang   ACPI/init: Invoke...
989
  	acpi_early_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
990
991
  	if (late_time_init)
  		late_time_init();
857baa87b   Pavel Tatashin   sched/clock: Enab...
992
  	sched_clock_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
993
  	calibrate_delay();
95846ecf9   Gargi Sharma   pid: replace pid ...
994
  	pid_idr_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
995
  	anon_vma_init();
11520e5e7   Linus Torvalds   Revert "x86-64/ef...
996
  #ifdef CONFIG_X86
83e681897   Matt Fleming   efi: Make 'efi_en...
997
  	if (efi_enabled(EFI_RUNTIME_SERVICES))
11520e5e7   Linus Torvalds   Revert "x86-64/ef...
998
999
  		efi_enter_virtual_mode();
  #endif
b235beea9   Linus Torvalds   Clarify naming of...
1000
  	thread_stack_cache_init();
d84f4f992   David Howells   CRED: Inaugurate ...
1001
  	cred_init();
ff691f6e0   Heinrich Schuchardt   kernel/fork.c: ne...
1002
  	fork_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1003
  	proc_caches_init();
3ea056c50   Alexey Dobriyan   uts: create "stru...
1004
  	uts_ns_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1005
  	buffer_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
1007
  	key_init();
  	security_init();
0b4b3827d   Jason Wessel   x86, kgdb, init: ...
1008
  	dbg_late_init();
4248b0da4   Mel Gorman   fs, file table: r...
1009
  	vfs_caches_init();
629060270   Nicholas Piggin   mm: add PageWaite...
1010
  	pagecache_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1011
  	signals_init();
096523203   Alexey Dobriyan   seq_file: allocat...
1012
  	seq_file_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1013
  	proc_root_init();
e149ed2b8   Al Viro   take the targets ...
1014
  	nsfs_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1015
  	cpuset_init();
695df2132   Zefan Li   cpuset: initializ...
1016
  	cgroup_init();
c757249af   Shailabh Nagar   [PATCH] per-task-...
1017
  	taskstats_init_early();
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
1018
  	delayacct_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1019

4fc19708b   Nadav Amit   x86/alternatives:...
1020
  	poking_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1021
  	check_bugs();
b064a8fa7   Rafael J. Wysocki   ACPI / init: Swit...
1022
  	acpi_subsystem_init();
e7ff3a476   Thomas Gleixner   x86/amd: Check fo...
1023
  	arch_post_acpi_subsys_init();
6ae6996a4   Feng Tang   SFI: add platform...
1024
  	sfi_init_late();
dfd402a4c   Marco Elver   kcsan: Add Kernel...
1025
  	kcsan_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1026
1027
  
  	/* Do the rest non-__init'ed, we're now alive */
53c99bd66   Martin Schwidefsky   init: add arch_ca...
1028
  	arch_call_rest_init();
a9a3ed1ef   Borislav Petkov   x86: Fix early bo...
1029
1030
  
  	prevent_tail_call_optimization();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1031
  }
b99b87f70   Peter Oberparleiter   kernel: construct...
1032
1033
1034
1035
  /* 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 ...
1036
  	ctor_fn_t *fn = (ctor_fn_t *) __ctors_start;
b99b87f70   Peter Oberparleiter   kernel: construct...
1037

196a15b4e   H Hartley Sweeten   init/main.c: fix ...
1038
1039
  	for (; fn < (ctor_fn_t *) __ctors_end; fn++)
  		(*fn)();
b99b87f70   Peter Oberparleiter   kernel: construct...
1040
1041
  #endif
  }
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
  #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...
1061
1062
  			entry = memblock_alloc(sizeof(*entry),
  					       SMP_CACHE_BYTES);
f5c7310ac   Mike Rapoport   init/main: add ch...
1063
1064
1065
1066
  			if (!entry)
  				panic("%s: Failed to allocate %zu bytes
  ",
  				      __func__, sizeof(*entry));
7e1c4e279   Mike Rapoport   memblock: stop us...
1067
1068
  			entry->buf = memblock_alloc(strlen(str_entry) + 1,
  						    SMP_CACHE_BYTES);
f5c7310ac   Mike Rapoport   init/main: add ch...
1069
1070
1071
1072
  			if (!entry->buf)
  				panic("%s: Failed to allocate %zu bytes
  ",
  				      __func__, strlen(str_entry) + 1);
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
  			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 ...
1083
  	struct blacklist_entry *entry;
c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
1084
  	char fn_name[KSYM_SYMBOL_LEN];
0fd5ed8d8   Rasmus Villemoes   init/main.c: fix ...
1085
  	unsigned long addr;
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1086

c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
1087
  	if (list_empty(&blacklisted_initcalls))
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1088
  		return false;
0fd5ed8d8   Rasmus Villemoes   init/main.c: fix ...
1089
1090
  	addr = (unsigned long) dereference_function_descriptor(fn);
  	sprint_symbol_no_offset(fn_name, addr);
c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
1091

841c06d71   Prarit Bhargava   init: allow black...
1092
1093
1094
1095
1096
  	/*
  	 * 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 ...
1097
  	list_for_each_entry(entry, &blacklisted_initcalls, next) {
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1098
1099
1100
  		if (!strcmp(fn_name, entry->buf)) {
  			pr_debug("initcall %s blacklisted
  ", fn_name);
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1101
1102
1103
  			return true;
  		}
  	}
7b0b73d76   Prarit Bhargava   init/main.c: add ...
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
  	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...
1120
1121
  static __init_or_module void
  trace_initcall_start_cb(void *data, initcall_t fn)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1122
  {
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1123
  	ktime_t *calltime = (ktime_t *)data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1124

d75f773c8   Sakari Ailus   treewide: Switch ...
1125
1126
  	printk(KERN_DEBUG "calling  %pS @ %i
  ", fn, task_pid_nr(current));
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1127
1128
1129
1130
1131
1132
1133
1134
1135
  	*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 ...
1136
  	rettime = ktime_get();
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1137
  	delta = ktime_sub(rettime, *calltime);
22c5c03b4   Kevin Winchester   init/main.c: fix ...
1138
  	duration = (unsigned long long) ktime_to_ns(delta) >> 10;
d75f773c8   Sakari Ailus   treewide: Switch ...
1139
1140
  	printk(KERN_DEBUG "initcall %pS returned %d after %lld usecs
  ",
ea676e846   Andrew Morton   init/main.c: conv...
1141
  		 fn, ret, duration);
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1142
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1143

4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1144
  static ktime_t initcall_calltime;
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
1145
  #ifdef TRACEPOINTS_ENABLED
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
  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 ...
1156
  }
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
  # 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 ...
1173

e44612713   Kevin Winchester   init/main.c: mark...
1174
  int __init_or_module do_one_initcall(initcall_t fn)
22c5c03b4   Kevin Winchester   init/main.c: fix ...
1175
1176
  {
  	int count = preempt_count();
ff1c8fac8   Steven Rostedt   init: remove perm...
1177
  	char msgbuf[64];
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1178
  	int ret;
22c5c03b4   Kevin Winchester   init/main.c: fix ...
1179

7b0b73d76   Prarit Bhargava   init/main.c: add ...
1180
1181
  	if (initcall_blacklisted(fn))
  		return -EPERM;
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
1182
  	do_trace_initcall_start(fn);
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
1183
  	ret = fn();
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
1184
  	do_trace_initcall_finish(fn, ret);
8f0c45cdf   Ingo Molnar   enhance initcall_...
1185

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

e0df154f4   Linus Torvalds   Split up 'do_init...
1188
  	if (preempt_count() != count) {
bf5d770bd   Steven Rostedt   init: Do not warn...
1189
  		sprintf(msgbuf, "preemption imbalance ");
4a2b4b222   Peter Zijlstra   sched: Introduce ...
1190
  		preempt_count_set(count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1191
  	}
e0df154f4   Linus Torvalds   Split up 'do_init...
1192
  	if (irqs_disabled()) {
a76bfd0da   Cyrill Gorcunov   initcalls: Fix m6...
1193
  		strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
e0df154f4   Linus Torvalds   Split up 'do_init...
1194
1195
  		local_irq_enable();
  	}
d75f773c8   Sakari Ailus   treewide: Switch ...
1196
1197
  	WARN(msgbuf[0], "initcall %pS returned with %s
  ", fn, msgbuf);
59f9415ff   Arjan van de Ven   modules: extend i...
1198

38addce8b   Emese Revfy   gcc-plugins: Add ...
1199
  	add_latent_entropy();
30dbb20e6   Américo Wang   tracing: Remove b...
1200
  	return ret;
e0df154f4   Linus Torvalds   Split up 'do_init...
1201
  }
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
  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...
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
  	__initcall0_start,
  	__initcall1_start,
  	__initcall2_start,
  	__initcall3_start,
  	__initcall4_start,
  	__initcall5_start,
  	__initcall6_start,
  	__initcall7_start,
  	__initcall_end,
  };
96263d286   Jim Cromie   init: add comment...
1224
  /* Keep these in sync with initcalls in include/linux/init.h */
7c8f71935   Alexey Dobriyan   init/main.c: make...
1225
  static const char *initcall_level_names[] __initdata = {
a6fb6012e   Steven Rostedt (VMware)   init: Fix initcal...
1226
  	"pure",
9fb48c744   Jim Cromie   params: add 3rd a...
1227
1228
1229
1230
1231
1232
1233
  	"core",
  	"postcore",
  	"arch",
  	"subsys",
  	"fs",
  	"device",
  	"late",
026cee008   Pawel Moll   params: <level>_i...
1234
  };
7e2762e1d   Arvind Sankar   init/main.c: remo...
1235
1236
1237
1238
1239
  static int __init ignore_unknown_bootoption(char *param, char *val,
  			       const char *unused, void *arg)
  {
  	return 0;
  }
0068c92a9   Masami Hiramatsu   init/main.c: Allo...
1240
  static void __init do_initcall_level(int level, char *command_line)
e0df154f4   Linus Torvalds   Split up 'do_init...
1241
  {
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1242
  	initcall_entry_t *fn;
e0df154f4   Linus Torvalds   Split up 'do_init...
1243

026cee008   Pawel Moll   params: <level>_i...
1244
  	parse_args(initcall_level_names[level],
0068c92a9   Masami Hiramatsu   init/main.c: Allo...
1245
  		   command_line, __start___param,
026cee008   Pawel Moll   params: <level>_i...
1246
1247
  		   __stop___param - __start___param,
  		   level, level,
7e2762e1d   Arvind Sankar   init/main.c: remo...
1248
  		   NULL, ignore_unknown_bootoption);
026cee008   Pawel Moll   params: <level>_i...
1249

4ee7c60de   Steven Rostedt (VMware)   init, tracing: Ad...
1250
  	trace_initcall_level(initcall_level_names[level]);
026cee008   Pawel Moll   params: <level>_i...
1251
  	for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1252
  		do_one_initcall(initcall_from_entry(fn));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1253
  }
026cee008   Pawel Moll   params: <level>_i...
1254
1255
1256
  static void __init do_initcalls(void)
  {
  	int level;
0068c92a9   Masami Hiramatsu   init/main.c: Allo...
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
  	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...
1270

0068c92a9   Masami Hiramatsu   init/main.c: Allo...
1271
  	kfree(command_line);
026cee008   Pawel Moll   params: <level>_i...
1272
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1273
1274
1275
1276
1277
1278
1279
1280
1281
  /*
   * 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 ...
1282
  	cpuset_init_smp();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1283
  	driver_init();
b04c3afb2   Eric W. Biederman   [PATCH] sysctl: m...
1284
  	init_irq_proc();
b99b87f70   Peter Oberparleiter   kernel: construct...
1285
  	do_ctors();
d5767c535   Linus Torvalds   bootup: move 'use...
1286
  	usermodehelper_enable();
b0f84374b   wangyanqing   bootup: move 'use...
1287
  	do_initcalls();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1288
  }
7babe8db9   Eduard - Gabriel Munteanu   Full conversion t...
1289
  static void __init do_pre_smp_initcalls(void)
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
1290
  {
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1291
  	initcall_entry_t *fn;
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
1292

4ee7c60de   Steven Rostedt (VMware)   init, tracing: Ad...
1293
  	trace_initcall_level("early");
026cee008   Pawel Moll   params: <level>_i...
1294
  	for (fn = __initcall_start; fn < __initcall0_start; fn++)
1b1eeca7e   Ard Biesheuvel   init: allow initc...
1295
  		do_one_initcall(initcall_from_entry(fn));
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
1296
  }
a74fb73c1   Al Viro   infrastructure fo...
1297
  static int run_init_process(const char *init_filename)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1298
  {
b88c50ac3   Arvind Sankar   init/main.c: log ...
1299
  	const char *const *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1300
  	argv_init[0] = init_filename;
3f5c15d8a   Paul Menzel   init/main.c: log ...
1301
1302
  	pr_info("Run %s as init process
  ", init_filename);
b88c50ac3   Arvind Sankar   init/main.c: log ...
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
  	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);
be619f7f0   Eric W. Biederman   exec: Implement k...
1313
  	return kernel_execve(init_filename, argv_init, envp_init);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1314
  }
ba24762bd   Michael Opdenacker   init: make init f...
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
  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...
1329
  static noinline void __init kernel_init_freeable(void);
d6b212380   Al Viro   make sure that we...
1330

0f5bf6d0a   Laura Abbott   arch: Rename CONF...
1331
  #if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
39290b389   AKASHI Takahiro   module: extend 'r...
1332
  bool rodata_enabled __ro_after_init = true;
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1333
1334
1335
1336
1337
  static int __init set_debug_rodata(char *str)
  {
  	return strtobool(str, &rodata_enabled);
  }
  __setup("rodata=", set_debug_rodata);
39290b389   AKASHI Takahiro   module: extend 'r...
1338
  #endif
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1339

0f5bf6d0a   Laura Abbott   arch: Rename CONF...
1340
  #ifdef CONFIG_STRICT_KERNEL_RWX
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1341
1342
  static void mark_readonly(void)
  {
2959a5f72   Jinbum Park   mm: add arch-inde...
1343
  	if (rodata_enabled) {
ae646f0b9   Jeffrey Hugo   init: fix false p...
1344
  		/*
ba1803142   Paul E. McKenney   main: Replace rcu...
1345
1346
  		 * 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...
1347
1348
1349
  		 * flushed so that we don't hit false positives looking for
  		 * insecure pages which are W+X.
  		 */
ba1803142   Paul E. McKenney   main: Replace rcu...
1350
  		rcu_barrier();
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1351
  		mark_rodata_ro();
2959a5f72   Jinbum Park   mm: add arch-inde...
1352
1353
  		rodata_test();
  	} else
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1354
1355
1356
  		pr_info("Kernel memory protection disabled.
  ");
  }
f596ded1a   Christophe Leroy   init/main.c: fix ...
1357
1358
1359
1360
1361
1362
  #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...
1363
1364
1365
1366
1367
1368
1369
  #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...
1370
1371
  void __weak free_initmem(void)
  {
f40399992   Mike Rapoport   init: free_initme...
1372
  	free_initmem_default(POISON_FREE_INITMEM);
997aef68a   Mike Rapoport   init: provide a g...
1373
  }
d6b212380   Al Viro   make sure that we...
1374
  static int __ref kernel_init(void *unused)
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1375
  {
ba24762bd   Michael Opdenacker   init: make init f...
1376
  	int ret;
d6b212380   Al Viro   make sure that we...
1377
  	kernel_init_freeable();
22a9d6456   Arjan van de Ven   async: Asynchrono...
1378
1379
  	/* need to finish all async __init code before freeing the memory */
  	async_synchronize_full();
82d083ab6   Masami Hiramatsu   kprobes: tracing/...
1380
  	kprobe_free_init_mem();
b80f0f6c9   Steven Rostedt (VMware)   ftrace: Have init...
1381
  	ftrace_free_init_mem();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1382
  	free_initmem();
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1383
  	mark_readonly();
b976690f5   Joerg Roedel   x86/mm/pti: Intro...
1384
1385
1386
1387
1388
1389
  
  	/*
  	 * Kernel mappings are now finalized - update the userspace page-table
  	 * to finalize PTI.
  	 */
  	pti_finalize();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1390
1391
  	system_state = SYSTEM_RUNNING;
  	numa_default_policy();
967dcb8fe   Paul E. McKenney   rcu: Wire up rcu_...
1392
  	rcu_end_inkernel_boot();
3db978d48   Vlastimil Babka   kernel/sysctl: su...
1393
  	do_sysctl_args();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1394
  	if (ramdisk_execute_command) {
ba24762bd   Michael Opdenacker   init: make init f...
1395
1396
  		ret = run_init_process(ramdisk_execute_command);
  		if (!ret)
a74fb73c1   Al Viro   infrastructure fo...
1397
  			return 0;
ba24762bd   Michael Opdenacker   init: make init f...
1398
1399
1400
  		pr_err("Failed to execute %s (error %d)
  ",
  		       ramdisk_execute_command, ret);
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1401
1402
1403
1404
1405
1406
1407
1408
1409
  	}
  
  	/*
  	 * 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...
1410
1411
  		ret = run_init_process(execute_command);
  		if (!ret)
a74fb73c1   Al Viro   infrastructure fo...
1412
  			return 0;
6ef4536e2   Andy Lutomirski   init: allow CONFI...
1413
1414
  		panic("Requested init %s failed (error %d).",
  		      execute_command, ret);
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1415
  	}
ada4ab7af   Chris Down   init: allow distr...
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
  
  	if (CONFIG_DEFAULT_INIT[0] != '\0') {
  		ret = run_init_process(CONFIG_DEFAULT_INIT);
  		if (ret)
  			pr_err("Default init %s failed (error %d)
  ",
  			       CONFIG_DEFAULT_INIT, ret);
  		else
  			return 0;
  	}
ba24762bd   Michael Opdenacker   init: make init f...
1426
1427
1428
1429
  	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...
1430
  		return 0;
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1431

ba24762bd   Michael Opdenacker   init: make init f...
1432
  	panic("No working init found.  Try passing init= option to kernel. "
8c27ceff3   Mauro Carvalho Chehab   docs: fix locatio...
1433
  	      "See Linux Documentation/admin-guide/init.rst for guidance.");
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1434
  }
8f740636d   Christoph Hellwig   init: open code s...
1435
  /* Open /dev/console, for stdin/stdout/stderr, this should never fail */
a94b52144   Christoph Hellwig   init: mark consol...
1436
  void __init console_on_rootfs(void)
b49a733d6   Dominik Brodowski   init: unify openi...
1437
  {
8f740636d   Christoph Hellwig   init: open code s...
1438
  	struct file *file = filp_open("/dev/console", O_RDWR, 0);
b49a733d6   Dominik Brodowski   init: unify openi...
1439

8f740636d   Christoph Hellwig   init: open code s...
1440
1441
1442
1443
1444
  	if (IS_ERR(file)) {
  		pr_err("Warning: unable to open an initial console.
  ");
  		return;
  	}
f07353107   Christoph Hellwig   init: add an init...
1445
1446
1447
1448
  	init_dup(file);
  	init_dup(file);
  	init_dup(file);
  	fput(file);
b49a733d6   Dominik Brodowski   init: unify openi...
1449
  }
f80b0c904   Vineet Gupta   Ensure that kerne...
1450
  static noinline void __init kernel_init_freeable(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1451
  {
b433c3d45   Peter Zijlstra   init, sched: Fix ...
1452
1453
1454
1455
  	/*
  	 * Wait until kthreadd is all set-up.
  	 */
  	wait_for_completion(&kthreadd_done);
31a67102f   Linus Torvalds   Fix blocking allo...
1456
1457
1458
  
  	/* Now the scheduler is fully set up and can do blocking allocations */
  	gfp_allowed_mask = __GFP_BITS_MASK;
58568d2a8   Miao Xie   cpuset,mm: update...
1459
1460
1461
  	/*
  	 * init can allocate pages on any node
  	 */
3c466d46a   Lai Jiangshan   init: use N_MEMOR...
1462
  	set_mems_allowed(node_states[N_MEMORY]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1463

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

3347fa092   Tejun Heo   workqueue: make w...
1467
  	workqueue_init();
597b7305d   Michal Hocko   mm: move mm_percp...
1468
  	init_mm_internals();
30b491e2b   Uladzislau Rezki (Sony)   rcu-tasks: Move R...
1469
  	rcu_init_tasks_generic();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1470
  	do_pre_smp_initcalls();
004417a6d   Peter Zijlstra   perf, arch: Clean...
1471
  	lockup_detector_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1472

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1473
1474
  	smp_init();
  	sched_init_smp();
f1b192b11   Daniel Jordan   padata: initializ...
1475
  	padata_init();
0e1cc95b4   Mel Gorman   mm: meminit: fini...
1476
  	page_alloc_init_late();
2f1ee0913   Qian Cai   Revert "mm: use e...
1477
1478
  	/* Initialize page ext after all struct pages are initialized. */
  	page_ext_init();
0e1cc95b4   Mel Gorman   mm: meminit: fini...
1479

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1480
  	do_basic_setup();
8c0d88498   Brendan Higgins   init: main: add K...
1481
  	kunit_run_all_tests();
b49a733d6   Dominik Brodowski   init: unify openi...
1482
  	console_on_rootfs();
2bd3a997b   Eric W. Biederman   init: Open /dev/c...
1483

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1484
1485
1486
1487
  	/*
  	 * check if there is an early userspace init.  If yes, let it do all
  	 * the work
  	 */
eb9d7d390   Christoph Hellwig   init: add an init...
1488
  	if (init_eaccess(ramdisk_execute_command) != 0) {
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
1489
  		ramdisk_execute_command = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1490
  		prepare_namespace();
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
1491
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1492
1493
1494
1495
1496
  
  	/*
  	 * 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...
1497
1498
1499
  	 *
  	 * rootfs is available now, try loading the public keys
  	 * and default modules
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1500
  	 */
bb813f4c9   Tejun Heo   init, block: try ...
1501

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