Blame view

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

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

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

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

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

7e96287dd   Vivek Goyal   [PATCH] kdump: in...
160
161
162
163
164
165
166
  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...
167
168
  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
169
  static const char *panic_later, *panic_param;
914dcaa84   Rusty Russell   param: make param...
170
  extern const struct obs_kernel_param __setup_start[], __setup_end[];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171

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

a99cd1125   Chris Metcalf   init: fix bug whe...
241
  /* Change NUL term back to "=", to make "param" the whole string. */
ecc861705   Luis R. Rodriguez   module: add extra...
242
243
  static int __init repair_env_string(char *param, char *val,
  				    const char *unused, void *arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
244
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
246
247
248
249
250
251
252
253
254
255
  	if (val) {
  		/* param=val or param="val"? */
  		if (val == param+strlen(param)+1)
  			val[-1] = '=';
  		else if (val == param+strlen(param)+2) {
  			val[-2] = '=';
  			memmove(val-1, val, strlen(val)+1);
  			val--;
  		} else
  			BUG();
  	}
a99cd1125   Chris Metcalf   init: fix bug whe...
256
257
  	return 0;
  }
51e158c12   Rusty Russell   param: hand argum...
258
  /* Anything after -- gets handed straight to init. */
ecc861705   Luis R. Rodriguez   module: add extra...
259
260
  static int __init set_init_arg(char *param, char *val,
  			       const char *unused, void *arg)
51e158c12   Rusty Russell   param: hand argum...
261
262
263
264
265
  {
  	unsigned int i;
  
  	if (panic_later)
  		return 0;
ecc861705   Luis R. Rodriguez   module: add extra...
266
  	repair_env_string(param, val, unused, NULL);
51e158c12   Rusty Russell   param: hand argum...
267
268
269
270
271
272
273
274
275
276
277
  
  	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...
278
279
280
281
  /*
   * 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...
282
283
  static int __init unknown_bootoption(char *param, char *val,
  				     const char *unused, void *arg)
a99cd1125   Chris Metcalf   init: fix bug whe...
284
  {
ecc861705   Luis R. Rodriguez   module: add extra...
285
  	repair_env_string(param, val, unused, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
286
287
288
289
  
  	/* Handle obsolete-style parameters */
  	if (obsolete_checksetup(param))
  		return 0;
f066a4f6d   Rusty Russell   param: don't comp...
290
291
  	/* Unused module parameter. */
  	if (strchr(param, '.') && (!val || strchr(param, '.') < val))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
294
295
296
297
298
299
300
301
  
  	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...
302
  				panic_later = "env";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
304
305
306
307
308
309
310
311
312
313
  				panic_param = param;
  			}
  			if (!strncmp(param, envp_init[i], val - param))
  				break;
  		}
  		envp_init[i] = param;
  	} else {
  		/* Command line option */
  		unsigned int i;
  		for (i = 0; argv_init[i]; i++) {
  			if (i == MAX_INIT_ARGS) {
499a4584d   Tetsuo Handa   init: fix possibl...
314
  				panic_later = "init";
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
  				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...
339
340
341
342
343
344
345
346
347
348
349
  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
350
  #ifndef CONFIG_SMP
34db18a05   Amerigo Wang   smp: move smp set...
351
  static const unsigned int setup_max_cpus = NR_CPUS;
e0982e90c   Mike Travis   init: move setup ...
352
  static inline void setup_nr_cpu_ids(void) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
  static inline void smp_prepare_cpus(unsigned int maxcpus) { }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
354
355
356
  #endif
  
  /*
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
357
358
359
360
361
362
363
   * 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)
  {
098b081b5   Santosh Shilimkar   init/main.c: use ...
364
365
366
367
368
  	saved_command_line =
  		memblock_virt_alloc(strlen(boot_command_line) + 1, 0);
  	initcall_command_line =
  		memblock_virt_alloc(strlen(boot_command_line) + 1, 0);
  	static_command_line = memblock_virt_alloc(strlen(command_line) + 1, 0);
dd4d9fecb   Fabian Frederick   init/main.c: code...
369
370
  	strcpy(saved_command_line, boot_command_line);
  	strcpy(static_command_line, command_line);
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
371
372
373
  }
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
375
376
377
378
379
380
   * 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 ...
381
  static __initdata DECLARE_COMPLETION(kthreadd_done);
bd721ea73   Fabian Frederick   treewide: replace...
382
  static noinline void __ref rest_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
  {
8fb12156b   Thomas Gleixner   init: Pin init ta...
384
  	struct task_struct *tsk;
73c279927   Eric W. Biederman   kthread: don't de...
385
  	int pid;
7db905e63   Paul E. McKenney   rcu: Move end of ...
386
  	rcu_scheduler_starting();
b433c3d45   Peter Zijlstra   init, sched: Fix ...
387
  	/*
971585692   Peter Zijlstra   init: Fix comment
388
  	 * We need to spawn init first so that it obtains pid 1, however
b433c3d45   Peter Zijlstra   init, sched: Fix ...
389
390
391
  	 * 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...
392
393
394
395
396
397
398
399
400
401
  	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
402
  	numa_default_policy();
73c279927   Eric W. Biederman   kthread: don't de...
403
  	pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
d11c563dd   Paul E. McKenney   sched: Use lockde...
404
  	rcu_read_lock();
5cd204550   Pavel Emelyanov   Deprecate find_ta...
405
  	kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
d11c563dd   Paul E. McKenney   sched: Use lockde...
406
  	rcu_read_unlock();
1c3c5eab1   Thomas Gleixner   sched/core: Enabl...
407
408
409
  
  	/*
  	 * Enable might_sleep() and smp_processor_id() checks.
f142f08bf   Florian La Roche   Fix typo in comment.
410
  	 * They cannot be enabled earlier because with CONFIG_PREEMPT=y
1c3c5eab1   Thomas Gleixner   sched/core: Enabl...
411
412
413
414
415
  	 * 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 ...
416
  	complete(&kthreadd_done);
f340c0d1a   Ingo Molnar   [PATCH] Tweak idl...
417
418
419
  
  	/*
  	 * The boot idle thread must execute schedule()
1df21055e   Ingo Molnar   sched: add init_i...
420
  	 * at least once to get things moving:
f340c0d1a   Ingo Molnar   [PATCH] Tweak idl...
421
  	 */
bd2f55361   Thomas Gleixner   sched/rt: Use sch...
422
  	schedule_preempt_disabled();
5bfb5d690   Nick Piggin   [PATCH] sched: di...
423
  	/* Call into cpu_idle with preempt disabled */
a1a04ec3c   Thomas Gleixner   idle: Provide a g...
424
  	cpu_startup_entry(CPUHP_ONLINE);
1df21055e   Ingo Molnar   sched: add init_i...
425
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
426
427
  
  /* Check for early params. */
ecc861705   Luis R. Rodriguez   module: add extra...
428
429
  static int __init do_early_param(char *param, char *val,
  				 const char *unused, void *arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
430
  {
914dcaa84   Rusty Russell   param: make param...
431
  	const struct obs_kernel_param *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
432
433
  
  	for (p = __setup_start; p < __setup_end; p++) {
b1e4d20cb   Michal Schmidt   params: make dash...
434
  		if ((p->early && parameq(param, p->str)) ||
18a8bd949   Yinghai Lu   serial: convert e...
435
436
437
  		    (strcmp(param, "console") == 0 &&
  		     strcmp(p->str, "earlycon") == 0)
  		) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
  			if (p->setup_func(val) != 0)
ea676e846   Andrew Morton   init/main.c: conv...
439
440
  				pr_warn("Malformed early option '%s'
  ", param);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
441
442
443
444
445
  		}
  	}
  	/* We accept everything at this stage. */
  	return 0;
  }
13977091a   Magnus Damm   Driver Core: earl...
446
447
  void __init parse_early_options(char *cmdline)
  {
ecc861705   Luis R. Rodriguez   module: add extra...
448
449
  	parse_args("early options", cmdline, NULL, 0, 0, 0, NULL,
  		   do_early_param);
13977091a   Magnus Damm   Driver Core: earl...
450
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
451
452
453
  /* 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...
454
455
  	static int done __initdata;
  	static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
456
457
458
459
460
  
  	if (done)
  		return;
  
  	/* All fall through to do_early_param. */
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
461
  	strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
13977091a   Magnus Damm   Driver Core: earl...
462
  	parse_early_options(tmp_cmdline);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
463
464
  	done = 1;
  }
e7ff3a476   Thomas Gleixner   x86/amd: Check fo...
465
  void __init __weak arch_post_acpi_subsys_init(void) { }
839ad62e7   Benjamin Herrenschmidt   [POWERPC] Use __w...
466
  void __init __weak smp_setup_processor_id(void)
033ab7f8e   Andrew Morton   [PATCH] add smp_s...
467
468
  {
  }
eded09ccf   David Howells   FRV: gcc-4.1.2 al...
469
  # if THREAD_SIZE >= PAGE_SIZE
b235beea9   Linus Torvalds   Clarify naming of...
470
  void __init __weak thread_stack_cache_init(void)
8c9843e57   Benjamin Herrenschmidt   [POWERPC] Add thr...
471
472
  {
  }
eded09ccf   David Howells   FRV: gcc-4.1.2 al...
473
  #endif
8c9843e57   Benjamin Herrenschmidt   [POWERPC] Add thr...
474

c7753208a   Tom Lendacky   x86, swiotlb: Add...
475
  void __init __weak mem_encrypt_init(void) { }
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
476
477
  bool initcall_debug;
  core_param(initcall_debug, initcall_debug, bool, 0644);
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
478
479
  
  #ifdef TRACEPOINTS_ENABLED
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
480
  static void __init initcall_debug_enable(void);
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
481
482
483
484
485
  #else
  static inline void initcall_debug_enable(void)
  {
  }
  #endif
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
486

444f478f6   Pekka Enberg   init: introduce m...
487
488
489
490
491
  /*
   * Set up kernel memory allocators
   */
  static void __init mm_init(void)
  {
eefa864b7   Joonsoo Kim   mm/page_ext: resu...
492
493
494
495
496
  	/*
  	 * page_ext requires contiguous pages,
  	 * bigger than MAX_ORDER unless SPARSEMEM.
  	 */
  	page_ext_init_flatmem();
444f478f6   Pekka Enberg   init: introduce m...
497
498
  	mem_init();
  	kmem_cache_init();
b35f1819a   Kirill A. Shutemov   mm: create a sepa...
499
  	pgtable_init();
444f478f6   Pekka Enberg   init: introduce m...
500
  	vmalloc_init();
0ddab1d2e   Toshi Kani   lib/ioremap.c: ad...
501
  	ioremap_huge_init();
613e396bc   Thomas Gleixner   init: Invoke init...
502
503
  	/* Should be run before the first non-init thread is created */
  	init_espfix_bsp();
aa8c6248f   Thomas Gleixner   x86/mm/pti: Add i...
504
505
  	/* Should be run after espfix64 is set up. */
  	pti_init();
444f478f6   Pekka Enberg   init: introduce m...
506
  }
722a9f929   Andi Kleen   asmlinkage: Add e...
507
  asmlinkage __visible void __init start_kernel(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
508
  {
dd4d9fecb   Fabian Frederick   init/main.c: code...
509
510
  	char *command_line;
  	char *after_dashes;
033ab7f8e   Andrew Morton   [PATCH] add smp_s...
511

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

ddbcc7e8e   Paul Menage   Task Control Grou...
516
  	cgroup_init_early();
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
517
518
  
  	local_irq_disable();
2ce802f62   Tejun Heo   lockdep: Move ear...
519
  	early_boot_irqs_disabled = true;
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
520

1b3b3b49b   Viresh Kumar   init/main: proper...
521
522
523
524
  	/*
  	 * Interrupts are still disabled. Do necessary setups, then
  	 * enable them.
  	 */
44fd22992   Stas Sergeev   [PATCH] Register ...
525
  	boot_cpu_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
526
  	page_address_init();
ea676e846   Andrew Morton   init/main.c: conv...
527
  	pr_notice("%s", linux_banner);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
528
  	setup_arch(&command_line);
121388a31   Laura Abbott   init: move stack ...
529
530
  	/*
  	 * Set up the the initial canary and entropy after arch
33d72f382   Daniel Micay   init/main.c: extr...
531
  	 * and after adding latent and command line entropy.
121388a31   Laura Abbott   init: move stack ...
532
533
  	 */
  	add_latent_entropy();
33d72f382   Daniel Micay   init/main.c: extr...
534
  	add_device_randomness(command_line, strlen(command_line));
121388a31   Laura Abbott   init: move stack ...
535
  	boot_init_stack_canary();
6345d24da   Linus Torvalds   mm: Fix boot cras...
536
  	mm_init_cpumask(&init_mm);
30d7e0d46   Alon Bar-Lev   [PATCH] Dynamic k...
537
  	setup_command_line(command_line);
e0982e90c   Mike Travis   init: move setup ...
538
  	setup_nr_cpu_ids();
d6647bdf9   Tejun Heo   init: set nr_cpu_...
539
  	setup_per_cpu_areas();
44fd22992   Stas Sergeev   [PATCH] Register ...
540
  	smp_prepare_boot_cpu();	/* arch-specific boot-cpu hooks */
b5b1404d0   Linus Torvalds   init: rename and ...
541
  	boot_cpu_hotplug_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
542

72675e131   Michal Hocko   mm, memory_hotplu...
543
  	build_all_zonelists(NULL);
83b519e8b   Pekka Enberg   slab: setup alloc...
544
  	page_alloc_init();
ea676e846   Andrew Morton   init/main.c: conv...
545
546
  	pr_notice("Kernel command line: %s
  ", boot_command_line);
83b519e8b   Pekka Enberg   slab: setup alloc...
547
  	parse_early_param();
51e158c12   Rusty Russell   param: hand argum...
548
549
550
  	after_dashes = parse_args("Booting kernel",
  				  static_command_line, __start___param,
  				  __stop___param - __start___param,
ecc861705   Luis R. Rodriguez   module: add extra...
551
  				  -1, -1, NULL, &unknown_bootoption);
3438cf549   Daniel Thompson   param: fix crash ...
552
  	if (!IS_ERR_OR_NULL(after_dashes))
51e158c12   Rusty Russell   param: hand argum...
553
  		parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
ecc861705   Luis R. Rodriguez   module: add extra...
554
  			   NULL, set_init_arg);
97ce2c88f   Jeremy Fitzhardinge   jump-label: initi...
555
556
  
  	jump_label_init();
83b519e8b   Pekka Enberg   slab: setup alloc...
557
558
559
560
  	/*
  	 * These use large bootmem allocations and must precede
  	 * kmem_cache_init()
  	 */
162a7e750   Mike Travis   printk: allocate ...
561
  	setup_log_buf(0);
83b519e8b   Pekka Enberg   slab: setup alloc...
562
563
564
  	vfs_caches_init_early();
  	sort_main_extable();
  	trap_init();
444f478f6   Pekka Enberg   init: introduce m...
565
  	mm_init();
de03c72cf   KOSAKI Motohiro   mm: convert mm->c...
566

f631718de   Steven Rostedt (VMware)   ftrace: Move ftra...
567
  	ftrace_init();
e725c731e   Steven Rostedt (VMware)   tracing: Split tr...
568
569
  	/* trace_printk can be enabled here */
  	early_trace_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
570
571
572
573
574
575
576
577
578
579
580
  	/*
  	 * 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...
581
582
583
  	if (WARN(!irqs_disabled(),
  		 "Interrupts were enabled *very* early, fixing it
  "))
c4a68306b   Ard van Breemen   [PATCH] start_ker...
584
  		local_irq_disable();
0a835c4f0   Matthew Wilcox   Reimplement IDR a...
585
  	radix_tree_init();
3347fa092   Tejun Heo   workqueue: make w...
586
587
  
  	/*
7d229c668   Tal Shorer   main: kernel_star...
588
589
590
591
592
593
  	 * 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...
594
595
596
597
598
  	 * 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
599
  	rcu_init();
5f893b263   Steven Rostedt (Red Hat)   tracing: Move ena...
600

e725c731e   Steven Rostedt (VMware)   tracing: Split tr...
601
  	/* Trace events are available after this */
5f893b263   Steven Rostedt (Red Hat)   tracing: Move ena...
602
  	trace_init();
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
603
604
  	if (initcall_debug)
  		initcall_debug_enable();
65f382fd0   Frederic Weisbecker   context_tracking:...
605
  	context_tracking_init();
0b8f1efad   Yinghai Lu   sparse irq_desc[]...
606
607
  	/* init some links before init_ISA_irqs() */
  	early_irq_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
608
  	init_IRQ();
ad2b13536   Thomas Gleixner   tick: Call tick_i...
609
  	tick_init();
d6dd50e07   Linus Torvalds   Merge branch 'cor...
610
  	rcu_init_nohz();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
611
  	init_timers();
c0a313296   Thomas Gleixner   [PATCH] hrtimer: ...
612
  	hrtimers_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
613
  	softirq_init();
ad596171e   John Stultz   [PATCH] Time: Use...
614
  	timekeeping_init();
88fecaa27   John Stultz   [PATCH] time init...
615
  	time_init();
f92bac3b1   Sergey Senozhatsky   printk: rename nm...
616
  	printk_safe_init();
9e6302056   Stephane Eranian   perf: Use hrtimer...
617
  	perf_event_init();
93e028148   Heiko Carstens   [PATCH] lockdep: ...
618
  	profile_init();
d8ad7d112   Takao Indoh   generic-ipi: Fix ...
619
  	call_function_init();
f91eb62f7   Steven Rostedt   init: scream bloo...
620
621
  	WARN(!irqs_disabled(), "Interrupts were enabled early
  ");
c3bc8fd63   Joel Fernandes (Google)   tracing: Centrali...
622

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

7e85ee0c1   Pekka Enberg   slab,slub: don't ...
626
  	kmem_cache_init_late();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
627
628
629
630
631
632
633
634
  
  	/*
  	 * 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...
635
636
  		panic("Too many boot %s vars at `%s'", panic_later,
  		      panic_param);
fbb9ce953   Ingo Molnar   [PATCH] lockdep: ...
637

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

9a11b49a8   Ingo Molnar   [PATCH] lockdep: ...
640
641
642
643
644
645
  	/*
  	 * 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...
646
647
648
649
650
651
652
  	/*
  	 * 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
653
654
  #ifdef CONFIG_BLK_DEV_INITRD
  	if (initrd_start && !initrd_below_start_ok &&
bd673c7c3   Geert Uytterhoeven   initrd: cast `ini...
655
  	    page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {
ea676e846   Andrew Morton   init/main.c: conv...
656
657
  		pr_crit("initrd overwritten (0x%08lx < 0x%08lx) - disabling it.
  ",
bd673c7c3   Geert Uytterhoeven   initrd: cast `ini...
658
659
  		    page_to_pfn(virt_to_page((void *)initrd_start)),
  		    min_low_pfn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
660
661
662
  		initrd_start = 0;
  	}
  #endif
9b090f2da   Catalin Marinas   kmemleak: Initial...
663
  	kmemleak_init();
caba4cbbd   Waiman Long   debugobjects: Mak...
664
  	debug_objects_mem_init();
e7c8d5c99   Christoph Lameter   [PATCH] node loca...
665
  	setup_per_cpu_pageset();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
666
  	numa_policy_init();
9c71206d0   Dou Liyang   ACPI/init: Invoke...
667
  	acpi_early_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668
669
  	if (late_time_init)
  		late_time_init();
857baa87b   Pavel Tatashin   sched/clock: Enab...
670
  	sched_clock_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
671
  	calibrate_delay();
95846ecf9   Gargi Sharma   pid: replace pid ...
672
  	pid_idr_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
673
  	anon_vma_init();
11520e5e7   Linus Torvalds   Revert "x86-64/ef...
674
  #ifdef CONFIG_X86
83e681897   Matt Fleming   efi: Make 'efi_en...
675
  	if (efi_enabled(EFI_RUNTIME_SERVICES))
11520e5e7   Linus Torvalds   Revert "x86-64/ef...
676
677
  		efi_enter_virtual_mode();
  #endif
b235beea9   Linus Torvalds   Clarify naming of...
678
  	thread_stack_cache_init();
d84f4f992   David Howells   CRED: Inaugurate ...
679
  	cred_init();
ff691f6e0   Heinrich Schuchardt   kernel/fork.c: ne...
680
  	fork_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
681
  	proc_caches_init();
3ea056c50   Alexey Dobriyan   uts: create "stru...
682
  	uts_ns_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
683
  	buffer_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
684
685
  	key_init();
  	security_init();
0b4b3827d   Jason Wessel   x86, kgdb, init: ...
686
  	dbg_late_init();
4248b0da4   Mel Gorman   fs, file table: r...
687
  	vfs_caches_init();
629060270   Nicholas Piggin   mm: add PageWaite...
688
  	pagecache_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
689
  	signals_init();
096523203   Alexey Dobriyan   seq_file: allocat...
690
  	seq_file_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
691
  	proc_root_init();
e149ed2b8   Al Viro   take the targets ...
692
  	nsfs_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
693
  	cpuset_init();
695df2132   Zefan Li   cpuset: initializ...
694
  	cgroup_init();
c757249af   Shailabh Nagar   [PATCH] per-task-...
695
  	taskstats_init_early();
ca74e92b4   Shailabh Nagar   [PATCH] per-task-...
696
  	delayacct_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
697
698
  
  	check_bugs();
b064a8fa7   Rafael J. Wysocki   ACPI / init: Swit...
699
  	acpi_subsystem_init();
e7ff3a476   Thomas Gleixner   x86/amd: Check fo...
700
  	arch_post_acpi_subsys_init();
6ae6996a4   Feng Tang   SFI: add platform...
701
  	sfi_init_late();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
702

83e681897   Matt Fleming   efi: Make 'efi_en...
703
  	if (efi_enabled(EFI_RUNTIME_SERVICES)) {
785107923   Josh Triplett   efi: Defer freein...
704
  		efi_free_boot_services();
2223af389   Josh Triplett   efi: Fix the ACPI...
705
  	}
785107923   Josh Triplett   efi: Defer freein...
706

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
707
708
709
  	/* Do the rest non-__init'ed, we're now alive */
  	rest_init();
  }
b99b87f70   Peter Oberparleiter   kernel: construct...
710
711
712
713
  /* 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 ...
714
  	ctor_fn_t *fn = (ctor_fn_t *) __ctors_start;
b99b87f70   Peter Oberparleiter   kernel: construct...
715

196a15b4e   H Hartley Sweeten   init/main.c: fix ...
716
717
  	for (; fn < (ctor_fn_t *) __ctors_end; fn++)
  		(*fn)();
b99b87f70   Peter Oberparleiter   kernel: construct...
718
719
  #endif
  }
7b0b73d76   Prarit Bhargava   init/main.c: add ...
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
  #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);
  			entry = alloc_bootmem(sizeof(*entry));
  			entry->buf = alloc_bootmem(strlen(str_entry) + 1);
  			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 ...
751
  	struct blacklist_entry *entry;
c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
752
  	char fn_name[KSYM_SYMBOL_LEN];
0fd5ed8d8   Rasmus Villemoes   init/main.c: fix ...
753
  	unsigned long addr;
7b0b73d76   Prarit Bhargava   init/main.c: add ...
754

c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
755
  	if (list_empty(&blacklisted_initcalls))
7b0b73d76   Prarit Bhargava   init/main.c: add ...
756
  		return false;
0fd5ed8d8   Rasmus Villemoes   init/main.c: fix ...
757
758
  	addr = (unsigned long) dereference_function_descriptor(fn);
  	sprint_symbol_no_offset(fn_name, addr);
c8cdd2be2   Rasmus Villemoes   init/main.c: simp...
759

841c06d71   Prarit Bhargava   init: allow black...
760
761
762
763
764
  	/*
  	 * 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 ...
765
  	list_for_each_entry(entry, &blacklisted_initcalls, next) {
7b0b73d76   Prarit Bhargava   init/main.c: add ...
766
767
768
  		if (!strcmp(fn_name, entry->buf)) {
  			pr_debug("initcall %s blacklisted
  ", fn_name);
7b0b73d76   Prarit Bhargava   init/main.c: add ...
769
770
771
  			return true;
  		}
  	}
7b0b73d76   Prarit Bhargava   init/main.c: add ...
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
  	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...
788
789
  static __init_or_module void
  trace_initcall_start_cb(void *data, initcall_t fn)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
790
  {
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
791
  	ktime_t *calltime = (ktime_t *)data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
792

d62cf8152   Andrew Morton   init/main.c: don'...
793
794
  	printk(KERN_DEBUG "calling  %pF @ %i
  ", fn, task_pid_nr(current));
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
795
796
797
798
799
800
801
802
803
  	*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 ...
804
  	rettime = ktime_get();
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
805
  	delta = ktime_sub(rettime, *calltime);
22c5c03b4   Kevin Winchester   init/main.c: fix ...
806
  	duration = (unsigned long long) ktime_to_ns(delta) >> 10;
d62cf8152   Andrew Morton   init/main.c: don'...
807
808
  	printk(KERN_DEBUG "initcall %pF returned %d after %lld usecs
  ",
ea676e846   Andrew Morton   init/main.c: conv...
809
  		 fn, ret, duration);
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
810
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
811

4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
812
  static ktime_t initcall_calltime;
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
813
  #ifdef TRACEPOINTS_ENABLED
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
814
815
816
817
818
819
820
821
822
823
  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 ...
824
  }
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
  # 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 ...
841

e44612713   Kevin Winchester   init/main.c: mark...
842
  int __init_or_module do_one_initcall(initcall_t fn)
22c5c03b4   Kevin Winchester   init/main.c: fix ...
843
844
  {
  	int count = preempt_count();
ff1c8fac8   Steven Rostedt   init: remove perm...
845
  	char msgbuf[64];
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
846
  	int ret;
22c5c03b4   Kevin Winchester   init/main.c: fix ...
847

7b0b73d76   Prarit Bhargava   init/main.c: add ...
848
849
  	if (initcall_blacklisted(fn))
  		return -EPERM;
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
850
  	do_trace_initcall_start(fn);
4e37958d1   Steven Rostedt (VMware)   init, tracing: Ha...
851
  	ret = fn();
b0dc52f15   Steven Rostedt (VMware)   init: Have initca...
852
  	do_trace_initcall_finish(fn, ret);
8f0c45cdf   Ingo Molnar   enhance initcall_...
853

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

e0df154f4   Linus Torvalds   Split up 'do_init...
856
  	if (preempt_count() != count) {
bf5d770bd   Steven Rostedt   init: Do not warn...
857
  		sprintf(msgbuf, "preemption imbalance ");
4a2b4b222   Peter Zijlstra   sched: Introduce ...
858
  		preempt_count_set(count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
859
  	}
e0df154f4   Linus Torvalds   Split up 'do_init...
860
  	if (irqs_disabled()) {
a76bfd0da   Cyrill Gorcunov   initcalls: Fix m6...
861
  		strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
e0df154f4   Linus Torvalds   Split up 'do_init...
862
863
  		local_irq_enable();
  	}
f91eb62f7   Steven Rostedt   init: scream bloo...
864
865
  	WARN(msgbuf[0], "initcall %pF returned with %s
  ", fn, msgbuf);
59f9415ff   Arjan van de Ven   modules: extend i...
866

38addce8b   Emese Revfy   gcc-plugins: Add ...
867
  	add_latent_entropy();
30dbb20e6   Américo Wang   tracing: Remove b...
868
  	return ret;
e0df154f4   Linus Torvalds   Split up 'do_init...
869
  }
1b1eeca7e   Ard Biesheuvel   init: allow initc...
870
871
872
873
874
875
876
877
878
879
880
881
  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...
882
883
884
885
886
887
888
889
890
891
  	__initcall0_start,
  	__initcall1_start,
  	__initcall2_start,
  	__initcall3_start,
  	__initcall4_start,
  	__initcall5_start,
  	__initcall6_start,
  	__initcall7_start,
  	__initcall_end,
  };
96263d286   Jim Cromie   init: add comment...
892
  /* Keep these in sync with initcalls in include/linux/init.h */
026cee008   Pawel Moll   params: <level>_i...
893
  static char *initcall_level_names[] __initdata = {
a6fb6012e   Steven Rostedt (VMware)   init: Fix initcal...
894
  	"pure",
9fb48c744   Jim Cromie   params: add 3rd a...
895
896
897
898
899
900
901
  	"core",
  	"postcore",
  	"arch",
  	"subsys",
  	"fs",
  	"device",
  	"late",
026cee008   Pawel Moll   params: <level>_i...
902
  };
026cee008   Pawel Moll   params: <level>_i...
903
  static void __init do_initcall_level(int level)
e0df154f4   Linus Torvalds   Split up 'do_init...
904
  {
1b1eeca7e   Ard Biesheuvel   init: allow initc...
905
  	initcall_entry_t *fn;
e0df154f4   Linus Torvalds   Split up 'do_init...
906

08746a65c   Krzysztof Mazur   init: fix in-plac...
907
  	strcpy(initcall_command_line, saved_command_line);
026cee008   Pawel Moll   params: <level>_i...
908
  	parse_args(initcall_level_names[level],
08746a65c   Krzysztof Mazur   init: fix in-plac...
909
  		   initcall_command_line, __start___param,
026cee008   Pawel Moll   params: <level>_i...
910
911
  		   __stop___param - __start___param,
  		   level, level,
ecc861705   Luis R. Rodriguez   module: add extra...
912
  		   NULL, &repair_env_string);
026cee008   Pawel Moll   params: <level>_i...
913

4ee7c60de   Steven Rostedt (VMware)   init, tracing: Ad...
914
  	trace_initcall_level(initcall_level_names[level]);
026cee008   Pawel Moll   params: <level>_i...
915
  	for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
1b1eeca7e   Ard Biesheuvel   init: allow initc...
916
  		do_one_initcall(initcall_from_entry(fn));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
917
  }
026cee008   Pawel Moll   params: <level>_i...
918
919
920
  static void __init do_initcalls(void)
  {
  	int level;
19efb72fd   Borislav Petkov   init: Drop initca...
921
  	for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++)
026cee008   Pawel Moll   params: <level>_i...
922
923
  		do_initcall_level(level);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
924
925
926
927
928
929
930
931
932
  /*
   * 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 ...
933
  	cpuset_init_smp();
41ffe5d5c   Hugh Dickins   tmpfs: miscellane...
934
  	shmem_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
935
  	driver_init();
b04c3afb2   Eric W. Biederman   [PATCH] sysctl: m...
936
  	init_irq_proc();
b99b87f70   Peter Oberparleiter   kernel: construct...
937
  	do_ctors();
d5767c535   Linus Torvalds   bootup: move 'use...
938
  	usermodehelper_enable();
b0f84374b   wangyanqing   bootup: move 'use...
939
  	do_initcalls();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
940
  }
7babe8db9   Eduard - Gabriel Munteanu   Full conversion t...
941
  static void __init do_pre_smp_initcalls(void)
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
942
  {
1b1eeca7e   Ard Biesheuvel   init: allow initc...
943
  	initcall_entry_t *fn;
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
944

4ee7c60de   Steven Rostedt (VMware)   init, tracing: Ad...
945
  	trace_initcall_level("early");
026cee008   Pawel Moll   params: <level>_i...
946
  	for (fn = __initcall_start; fn < __initcall0_start; fn++)
1b1eeca7e   Ard Biesheuvel   init: allow initc...
947
  		do_one_initcall(initcall_from_entry(fn));
c2147a509   Eduard - Gabriel Munteanu   Better interface ...
948
  }
bb813f4c9   Tejun Heo   init, block: try ...
949
950
951
952
953
954
955
956
957
958
  /*
   * This function requests modules which should be loaded by default and is
   * called twice right after initrd is mounted and right before init is
   * exec'd.  If such modules are on either initrd or rootfs, they will be
   * loaded before control is passed to userland.
   */
  void __init load_default_modules(void)
  {
  	load_default_elevator_module();
  }
a74fb73c1   Al Viro   infrastructure fo...
959
  static int run_init_process(const char *init_filename)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
960
961
  {
  	argv_init[0] = init_filename;
3f5c15d8a   Paul Menzel   init/main.c: log ...
962
963
  	pr_info("Run %s as init process
  ", init_filename);
c4ad8f98b   Linus Torvalds   execve: use 'stru...
964
  	return do_execve(getname_kernel(init_filename),
ae903caae   Al Viro   Bury the conditio...
965
966
  		(const char __user *const __user *)argv_init,
  		(const char __user *const __user *)envp_init);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
967
  }
ba24762bd   Michael Opdenacker   init: make init f...
968
969
970
971
972
973
974
975
976
977
978
979
980
981
  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...
982
  static noinline void __init kernel_init_freeable(void);
d6b212380   Al Viro   make sure that we...
983

0f5bf6d0a   Laura Abbott   arch: Rename CONF...
984
  #if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
39290b389   AKASHI Takahiro   module: extend 'r...
985
  bool rodata_enabled __ro_after_init = true;
d2aa1acad   Kees Cook   mm/init: Add 'rod...
986
987
988
989
990
  static int __init set_debug_rodata(char *str)
  {
  	return strtobool(str, &rodata_enabled);
  }
  __setup("rodata=", set_debug_rodata);
39290b389   AKASHI Takahiro   module: extend 'r...
991
  #endif
d2aa1acad   Kees Cook   mm/init: Add 'rod...
992

0f5bf6d0a   Laura Abbott   arch: Rename CONF...
993
  #ifdef CONFIG_STRICT_KERNEL_RWX
d2aa1acad   Kees Cook   mm/init: Add 'rod...
994
995
  static void mark_readonly(void)
  {
2959a5f72   Jinbum Park   mm: add arch-inde...
996
  	if (rodata_enabled) {
ae646f0b9   Jeffrey Hugo   init: fix false p...
997
998
999
1000
1001
1002
1003
  		/*
  		 * load_module() results in W+X mappings, which are cleaned up
  		 * with call_rcu_sched().  Let's make sure that queued work is
  		 * flushed so that we don't hit false positives looking for
  		 * insecure pages which are W+X.
  		 */
  		rcu_barrier_sched();
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1004
  		mark_rodata_ro();
2959a5f72   Jinbum Park   mm: add arch-inde...
1005
1006
  		rodata_test();
  	} else
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
  		pr_info("Kernel memory protection disabled.
  ");
  }
  #else
  static inline void mark_readonly(void)
  {
  	pr_warn("This architecture does not have kernel memory protection.
  ");
  }
  #endif
d6b212380   Al Viro   make sure that we...
1017
  static int __ref kernel_init(void *unused)
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1018
  {
ba24762bd   Michael Opdenacker   init: make init f...
1019
  	int ret;
d6b212380   Al Viro   make sure that we...
1020
  	kernel_init_freeable();
22a9d6456   Arjan van de Ven   async: Asynchrono...
1021
1022
  	/* need to finish all async __init code before freeing the memory */
  	async_synchronize_full();
b80f0f6c9   Steven Rostedt (VMware)   ftrace: Have init...
1023
  	ftrace_free_init_mem();
578ae447e   Josh Poimboeuf   jump_label: Disab...
1024
  	jump_label_invalidate_initmem();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1025
  	free_initmem();
d2aa1acad   Kees Cook   mm/init: Add 'rod...
1026
  	mark_readonly();
b976690f5   Joerg Roedel   x86/mm/pti: Intro...
1027
1028
1029
1030
1031
1032
  
  	/*
  	 * Kernel mappings are now finalized - update the userspace page-table
  	 * to finalize PTI.
  	 */
  	pti_finalize();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1033
1034
  	system_state = SYSTEM_RUNNING;
  	numa_default_policy();
967dcb8fe   Paul E. McKenney   rcu: Wire up rcu_...
1035
  	rcu_end_inkernel_boot();
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1036
  	if (ramdisk_execute_command) {
ba24762bd   Michael Opdenacker   init: make init f...
1037
1038
  		ret = run_init_process(ramdisk_execute_command);
  		if (!ret)
a74fb73c1   Al Viro   infrastructure fo...
1039
  			return 0;
ba24762bd   Michael Opdenacker   init: make init f...
1040
1041
1042
  		pr_err("Failed to execute %s (error %d)
  ",
  		       ramdisk_execute_command, ret);
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1043
1044
1045
1046
1047
1048
1049
1050
1051
  	}
  
  	/*
  	 * 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...
1052
1053
  		ret = run_init_process(execute_command);
  		if (!ret)
a74fb73c1   Al Viro   infrastructure fo...
1054
  			return 0;
6ef4536e2   Andy Lutomirski   init: allow CONFI...
1055
1056
  		panic("Requested init %s failed (error %d).",
  		      execute_command, ret);
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1057
  	}
ba24762bd   Michael Opdenacker   init: make init f...
1058
1059
1060
1061
  	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...
1062
  		return 0;
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1063

ba24762bd   Michael Opdenacker   init: make init f...
1064
  	panic("No working init found.  Try passing init= option to kernel. "
8c27ceff3   Mauro Carvalho Chehab   docs: fix locatio...
1065
  	      "See Linux Documentation/admin-guide/init.rst for guidance.");
ee5bfa642   Vivek Goyal   [PATCH] generic: ...
1066
  }
f80b0c904   Vineet Gupta   Ensure that kerne...
1067
  static noinline void __init kernel_init_freeable(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1068
  {
b433c3d45   Peter Zijlstra   init, sched: Fix ...
1069
1070
1071
1072
  	/*
  	 * Wait until kthreadd is all set-up.
  	 */
  	wait_for_completion(&kthreadd_done);
31a67102f   Linus Torvalds   Fix blocking allo...
1073
1074
1075
  
  	/* Now the scheduler is fully set up and can do blocking allocations */
  	gfp_allowed_mask = __GFP_BITS_MASK;
58568d2a8   Miao Xie   cpuset,mm: update...
1076
1077
1078
  	/*
  	 * init can allocate pages on any node
  	 */
3c466d46a   Lai Jiangshan   init: use N_MEMOR...
1079
  	set_mems_allowed(node_states[N_MEMORY]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1080

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

3347fa092   Tejun Heo   workqueue: make w...
1084
  	workqueue_init();
597b7305d   Michal Hocko   mm: move mm_percp...
1085
  	init_mm_internals();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1086
  	do_pre_smp_initcalls();
004417a6d   Peter Zijlstra   perf, arch: Clean...
1087
  	lockup_detector_init();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1088

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1089
1090
  	smp_init();
  	sched_init_smp();
0e1cc95b4   Mel Gorman   mm: meminit: fini...
1091
  	page_alloc_init_late();
53dcaeeff   Qian Cai   Revert "mm: use e...
1092
1093
  	/* Initialize page ext after all struct pages are initialized. */
  	page_ext_init();
0e1cc95b4   Mel Gorman   mm: meminit: fini...
1094

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

c7248321a   Dominik Brodowski   fs: add ksys_dup{...
1101
1102
  	(void) ksys_dup(0);
  	(void) ksys_dup(0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1103
1104
1105
1106
  	/*
  	 * check if there is an early userspace init.  If yes, let it do all
  	 * the work
  	 */
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
1107
1108
1109
  
  	if (!ramdisk_execute_command)
  		ramdisk_execute_command = "/init";
cbfe20f56   Dominik Brodowski   fs: add do_facces...
1110
1111
  	if (ksys_access((const char __user *)
  			ramdisk_execute_command, 0) != 0) {
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
1112
  		ramdisk_execute_command = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1113
  		prepare_namespace();
ffdfc4097   Olof Johansson   [PATCH] Add rdini...
1114
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1115
1116
1117
1118
1119
  
  	/*
  	 * 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...
1120
1121
1122
  	 *
  	 * rootfs is available now, try loading the public keys
  	 * and default modules
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1123
  	 */
bb813f4c9   Tejun Heo   init, block: try ...
1124

c9cd2ce2b   Dmitry Kasatkin   integrity: provid...
1125
  	integrity_load_keys();
bb813f4c9   Tejun Heo   init, block: try ...
1126
  	load_default_modules();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1127
  }