Blame view
init/main.c
37.3 KB
457c89965 treewide: Add SPD... |
1 |
// SPDX-License-Identifier: GPL-2.0-only |
1da177e4c 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 init/main.c: code... |
10 |
* Simplified starting of init: Michael A. Griffith <grif@acm.org> |
1da177e4c Linux-2.6.12-rc2 |
11 |
*/ |
ea676e846 init/main.c: conv... |
12 |
#define DEBUG /* Enable initcall_debug */ |
1da177e4c Linux-2.6.12-rc2 |
13 |
#include <linux/types.h> |
8a293be0d core: migrate exc... |
14 |
#include <linux/extable.h> |
1da177e4c Linux-2.6.12-rc2 |
15 16 |
#include <linux/module.h> #include <linux/proc_fs.h> |
5c2c5c551 sched/headers, vf... |
17 |
#include <linux/binfmts.h> |
1da177e4c Linux-2.6.12-rc2 |
18 19 |
#include <linux/kernel.h> #include <linux/syscalls.h> |
9b5609fd7 stackprotector: i... |
20 |
#include <linux/stackprotector.h> |
1da177e4c Linux-2.6.12-rc2 |
21 22 23 |
#include <linux/string.h> #include <linux/ctype.h> #include <linux/delay.h> |
1da177e4c Linux-2.6.12-rc2 |
24 25 |
#include <linux/ioport.h> #include <linux/init.h> |
1da177e4c Linux-2.6.12-rc2 |
26 |
#include <linux/initrd.h> |
57c8a661d mm: remove includ... |
27 |
#include <linux/memblock.h> |
4a7a16dc0 ACPI: move declar... |
28 |
#include <linux/acpi.h> |
7684b8582 bootconfig: Load ... |
29 |
#include <linux/bootconfig.h> |
0c688614d console: move con... |
30 |
#include <linux/console.h> |
38b8d208a sched/headers: Pr... |
31 |
#include <linux/nmi.h> |
1da177e4c Linux-2.6.12-rc2 |
32 33 |
#include <linux/percpu.h> #include <linux/kmod.h> |
82d083ab6 kprobes: tracing/... |
34 |
#include <linux/kprobes.h> |
db64fe022 mm: rewrite vmap ... |
35 |
#include <linux/vmalloc.h> |
1da177e4c Linux-2.6.12-rc2 |
36 |
#include <linux/kernel_stat.h> |
d7cd56111 [PATCH] i386: cpu... |
37 |
#include <linux/start_kernel.h> |
1da177e4c Linux-2.6.12-rc2 |
38 |
#include <linux/security.h> |
3d4422332 Add generic helpe... |
39 |
#include <linux/smp.h> |
1da177e4c 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 Task Control Grou... |
47 |
#include <linux/cgroup.h> |
1da177e4c Linux-2.6.12-rc2 |
48 |
#include <linux/efi.h> |
906568c9c [PATCH] tick-mana... |
49 |
#include <linux/tick.h> |
786340614 sched/isolation: ... |
50 |
#include <linux/sched/isolation.h> |
6168a702a [PATCH] Declare i... |
51 |
#include <linux/interrupt.h> |
c757249af [PATCH] per-task-... |
52 |
#include <linux/taskstats_kern.h> |
ca74e92b4 [PATCH] per-task-... |
53 |
#include <linux/delayacct.h> |
1da177e4c Linux-2.6.12-rc2 |
54 |
#include <linux/unistd.h> |
3ea056c50 uts: create "stru... |
55 |
#include <linux/utsname.h> |
1da177e4c Linux-2.6.12-rc2 |
56 57 58 |
#include <linux/rmap.h> #include <linux/mempolicy.h> #include <linux/key.h> |
b6cd0b772 [PATCH] fs/buffer... |
59 |
#include <linux/buffer_head.h> |
eefa864b7 mm/page_ext: resu... |
60 |
#include <linux/page_ext.h> |
9a11b49a8 [PATCH] lockdep: ... |
61 |
#include <linux/debug_locks.h> |
3ac7fe5a4 infrastructure to... |
62 |
#include <linux/debugobjects.h> |
fbb9ce953 [PATCH] lockdep: ... |
63 |
#include <linux/lockdep.h> |
3c7b4e6b8 kmemleak: Add the... |
64 |
#include <linux/kmemleak.h> |
f1b192b11 padata: initializ... |
65 |
#include <linux/padata.h> |
84d737866 [PATCH] add child... |
66 |
#include <linux/pid_namespace.h> |
4c002c978 device.h: move 's... |
67 |
#include <linux/device/driver.h> |
73c279927 kthread: don't de... |
68 |
#include <linux/kthread.h> |
e6fe6649b sched: proper pro... |
69 |
#include <linux/sched.h> |
1777e4635 sched/headers: Pr... |
70 |
#include <linux/sched/init.h> |
a1c9eea9e proper prototype ... |
71 |
#include <linux/signal.h> |
199f0ca51 idr: create idr_l... |
72 |
#include <linux/idr.h> |
0b4b3827d x86, kgdb, init: ... |
73 |
#include <linux/kgdb.h> |
68bf21aa1 ftrace: mcount ca... |
74 |
#include <linux/ftrace.h> |
22a9d6456 async: Asynchrono... |
75 |
#include <linux/async.h> |
6ae6996a4 SFI: add platform... |
76 |
#include <linux/sfi.h> |
2b2af54a5 Driver Core: devt... |
77 |
#include <linux/shmem_fs.h> |
5a0e3ad6a include cleanup: ... |
78 |
#include <linux/slab.h> |
24a24bb6f perf: Move perf_e... |
79 |
#include <linux/perf_event.h> |
a74fb73c1 infrastructure fo... |
80 |
#include <linux/ptrace.h> |
aa8c6248f x86/mm/pti: Add i... |
81 |
#include <linux/pti.h> |
bb813f4c9 init, block: try ... |
82 83 |
#include <linux/blkdev.h> #include <linux/elevator.h> |
5d2a4e91a sched/clock: Move... |
84 |
#include <linux/sched/clock.h> |
299300258 sched/headers: Pr... |
85 |
#include <linux/sched/task.h> |
68db0cf10 sched/headers: Pr... |
86 |
#include <linux/sched/task_stack.h> |
65f382fd0 context_tracking:... |
87 |
#include <linux/context_tracking.h> |
47d06e532 random: run rando... |
88 |
#include <linux/random.h> |
7b0b73d76 init/main.c: add ... |
89 |
#include <linux/list.h> |
c9cd2ce2b integrity: provid... |
90 |
#include <linux/integrity.h> |
e149ed2b8 take the targets ... |
91 |
#include <linux/proc_ns.h> |
0ddab1d2e lib/ioremap.c: ad... |
92 |
#include <linux/io.h> |
39290b389 module: extend 'r... |
93 |
#include <linux/cache.h> |
2959a5f72 mm: add arch-inde... |
94 |
#include <linux/rodata_test.h> |
333522447 jump_label: Expli... |
95 |
#include <linux/jump_label.h> |
ae67d58d0 init/main.c: incl... |
96 |
#include <linux/mem_encrypt.h> |
dfd402a4c kcsan: Add Kernel... |
97 |
#include <linux/kcsan.h> |
eb9d7d390 init: add an init... |
98 |
#include <linux/init_syscalls.h> |
1da177e4c Linux-2.6.12-rc2 |
99 100 101 102 |
#include <asm/io.h> #include <asm/bugs.h> #include <asm/setup.h> |
a940199f2 [PATCH] x86_64: S... |
103 |
#include <asm/sections.h> |
37b73c828 [PATCH] x86/x86_6... |
104 |
#include <asm/cacheflush.h> |
1da177e4c Linux-2.6.12-rc2 |
105 |
|
4ee7c60de init, tracing: Ad... |
106 107 |
#define CREATE_TRACE_POINTS #include <trace/events/initcall.h> |
8c0d88498 init: main: add K... |
108 |
#include <kunit/test.h> |
aae5f662a kbuild: whitelist... |
109 |
static int kernel_init(void *); |
1da177e4c Linux-2.6.12-rc2 |
110 111 |
extern void init_IRQ(void); |
1da177e4c Linux-2.6.12-rc2 |
112 |
extern void radix_tree_init(void); |
1da177e4c Linux-2.6.12-rc2 |
113 |
|
2ce802f62 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 rcu: Teach RCU th... |
122 |
enum system_states system_state __read_mostly; |
1da177e4c 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 init/main.c: mark... |
133 |
void (*__initdata late_time_init)(void); |
1da177e4c Linux-2.6.12-rc2 |
134 |
|
30d7e0d46 [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 bootconfig: init:... |
141 142 |
/* Untouched extra command line */ static char *extra_command_line; |
131991620 bootconfig: init:... |
143 144 |
/* Extra init arguments */ static char *extra_init_args; |
1da177e4c Linux-2.6.12-rc2 |
145 |
|
f61872bb5 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 Linux-2.6.12-rc2 |
154 |
static char *execute_command; |
916db733d init: initialize ... |
155 |
static char *ramdisk_execute_command = "/init"; |
1da177e4c Linux-2.6.12-rc2 |
156 |
|
8b3b29550 adjust nosmp hand... |
157 |
/* |
c4b2c0c5f static_key: WARN ... |
158 159 160 |
* Used to generate warnings if static_key manipulation functions are used * before jump_label_init is called. */ |
dd4d9fecb init/main.c: code... |
161 |
bool static_key_initialized __read_mostly; |
c4b2c0c5f static_key: WARN ... |
162 163 164 |
EXPORT_SYMBOL_GPL(static_key_initialized); /* |
8b3b29550 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 init/main: fix re... |
170 |
* For ex. kdump situation where previous kernel has crashed, BIOS has been |
8b3b29550 adjust nosmp hand... |
171 172 173 174 |
* skipped and devices will be in unknown state. */ unsigned int reset_devices; EXPORT_SYMBOL(reset_devices); |
1da177e4c Linux-2.6.12-rc2 |
175 |
|
7e96287dd [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 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 Linux-2.6.12-rc2 |
185 |
static const char *panic_later, *panic_param; |
914dcaa84 param: make param... |
186 |
extern const struct obs_kernel_param __setup_start[], __setup_end[]; |
1da177e4c Linux-2.6.12-rc2 |
187 |
|
31c025b5f init/main.c: obso... |
188 |
static bool __init obsolete_checksetup(char *line) |
1da177e4c Linux-2.6.12-rc2 |
189 |
{ |
914dcaa84 param: make param... |
190 |
const struct obs_kernel_param *p; |
31c025b5f init/main.c: obso... |
191 |
bool had_early_param = false; |
1da177e4c Linux-2.6.12-rc2 |
192 193 194 195 |
p = __setup_start; do { int n = strlen(p->str); |
b1e4d20cb params: make dash... |
196 |
if (parameqn(line, p->str, n)) { |
1da177e4c Linux-2.6.12-rc2 |
197 |
if (p->early) { |
33df0d19e [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 Linux-2.6.12-rc2 |
202 |
if (line[n] == '\0' || line[n] == '=') |
31c025b5f init/main.c: obso... |
203 |
had_early_param = true; |
1da177e4c Linux-2.6.12-rc2 |
204 |
} else if (!p->setup_func) { |
ea676e846 init/main.c: conv... |
205 206 207 |
pr_warn("Parameter %s is obsolete, ignored ", p->str); |
31c025b5f init/main.c: obso... |
208 |
return true; |
1da177e4c Linux-2.6.12-rc2 |
209 |
} else if (p->setup_func(line + n)) |
31c025b5f init/main.c: obso... |
210 |
return true; |
1da177e4c Linux-2.6.12-rc2 |
211 212 213 |
} p++; } while (p < __setup_end); |
33df0d19e [PATCH] Allow ear... |
214 215 |
return had_early_param; |
1da177e4c 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 Linux-2.6.12-rc2 |
223 224 225 226 |
EXPORT_SYMBOL(loops_per_jiffy); static int __init debug_kernel(char *str) { |
a8fe19ebf kernel/printk: us... |
227 |
console_loglevel = CONSOLE_LOGLEVEL_DEBUG; |
f6f21c814 Convert loglevel-... |
228 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
229 230 231 232 |
} static int __init quiet_kernel(char *str) { |
a8fe19ebf kernel/printk: us... |
233 |
console_loglevel = CONSOLE_LOGLEVEL_QUIET; |
f6f21c814 Convert loglevel-... |
234 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
235 |
} |
f6f21c814 Convert loglevel-... |
236 237 |
early_param("debug", debug_kernel); early_param("quiet", quiet_kernel); |
1da177e4c Linux-2.6.12-rc2 |
238 239 240 |
static int __init loglevel(char *str) { |
808bf29b9 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 Linux-2.6.12-rc2 |
254 |
} |
f6f21c814 Convert loglevel-... |
255 |
early_param("loglevel", loglevel); |
1da177e4c Linux-2.6.12-rc2 |
256 |
|
de462e5f1 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 bootconfig: Exten... |
263 |
int i; |
de462e5f1 bootconfig: Fix t... |
264 265 266 267 268 |
if (!initrd_end) return NULL; data = (char *)initrd_end - BOOTCONFIG_MAGIC_LEN; |
50b8a7428 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 bootconfig: Fix t... |
279 |
|
50b8a7428 bootconfig: Exten... |
280 |
found: |
de462e5f1 bootconfig: Fix t... |
281 |
hdr = (u32 *)(data - 8); |
24aed0945 bootconfig: Load ... |
282 283 |
size = le32_to_cpu(hdr[0]); csum = le32_to_cpu(hdr[1]); |
de462e5f1 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 bootconfig: Load ... |
308 |
#ifdef CONFIG_BOOT_CONFIG |
51887d03a bootconfig: init:... |
309 |
|
a27026e95 bootconfig: init:... |
310 |
static char xbc_namebuf[XBC_KEYLEN_MAX] __initdata; |
51887d03a 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 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 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 bootconfig: init:... |
334 |
continue; |
88b913718 bootconfig: Print... |
335 |
} |
51887d03a bootconfig: init:... |
336 |
xbc_array_for_each_value(vnode, val) { |
88b913718 bootconfig: Print... |
337 338 |
ret = snprintf(buf, rest(buf, end), "%s=\"%s\" ", xbc_namebuf, val); |
51887d03a bootconfig: init:... |
339 340 341 |
if (ret < 0) return ret; buf += ret; |
51887d03a bootconfig: init:... |
342 |
} |
51887d03a 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 bootconfig: Mark ... |
381 |
static u32 boot_config_checksum(unsigned char *p, u32 size) |
7684b8582 bootconfig: Load ... |
382 383 384 385 386 387 388 389 |
{ u32 ret = 0; while (size--) ret += *p++; return ret; } |
f61872bb5 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 bootconfig: Use p... |
395 396 397 |
} return 0; } |
7495e0926 bootconfig: Only ... |
398 |
static void __init setup_boot_config(const char *cmdline) |
7684b8582 bootconfig: Load ... |
399 |
{ |
f61872bb5 bootconfig: Use p... |
400 |
static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; |
89b74cac7 tools/bootconfig:... |
401 402 |
const char *msg; int pos; |
7684b8582 bootconfig: Load ... |
403 |
u32 size, csum; |
477d08478 bootconfig: Fix t... |
404 |
char *data, *copy, *err; |
a00574036 bootconfig: Show ... |
405 |
int ret; |
7684b8582 bootconfig: Load ... |
406 |
|
611d0a95d bootconfig: Fix t... |
407 |
/* Cut out the bootconfig data even if we have no bootconfig option */ |
de462e5f1 bootconfig: Fix t... |
408 |
data = get_boot_config_from_initrd(&size, &csum); |
de462e5f1 bootconfig: Fix t... |
409 |
|
f61872bb5 bootconfig: Use p... |
410 |
strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); |
477d08478 bootconfig: Fix t... |
411 412 |
err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL, bootconfig_params); |
f61872bb5 bootconfig: Use p... |
413 |
|
477d08478 bootconfig: Fix t... |
414 |
if (IS_ERR(err) || !bootconfig_found) |
7684b8582 bootconfig: Load ... |
415 |
return; |
477d08478 bootconfig: Fix t... |
416 417 418 |
/* parse_args() stops at '--' and returns an address */ if (err) initargs_found = true; |
611d0a95d bootconfig: Fix t... |
419 420 421 422 423 |
if (!data) { pr_err("'bootconfig' found on command line, but no bootconfig found "); return; } |
7495e0926 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 bootconfig: Load ... |
428 |
return; |
7495e0926 bootconfig: Only ... |
429 |
} |
7684b8582 bootconfig: Load ... |
430 |
|
7495e0926 bootconfig: Only ... |
431 432 433 |
if (boot_config_checksum((unsigned char *)data, size) != csum) { pr_err("bootconfig checksum failed "); |
7684b8582 bootconfig: Load ... |
434 |
return; |
7495e0926 bootconfig: Only ... |
435 |
} |
7684b8582 bootconfig: Load ... |
436 437 438 |
copy = memblock_alloc(size + 1, SMP_CACHE_BYTES); if (!copy) { |
e241d14a8 bootconfig: Use b... |
439 440 |
pr_err("Failed to allocate memory for bootconfig "); |
7684b8582 bootconfig: Load ... |
441 442 443 444 445 |
return; } memcpy(copy, data, size); copy[size] = '\0'; |
89b74cac7 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 bootconfig: Show ... |
456 457 |
pr_info("Load bootconfig: %d bytes %d nodes ", size, ret); |
51887d03a bootconfig: init:... |
458 459 |
/* keys starting with "kernel." are passed via cmdline */ extra_command_line = xbc_make_cmdline("kernel"); |
131991620 bootconfig: init:... |
460 461 |
/* Also, "init." keys are init arguments */ extra_init_args = xbc_make_cmdline("init"); |
51887d03a bootconfig: init:... |
462 |
} |
7495e0926 bootconfig: Only ... |
463 |
return; |
7684b8582 bootconfig: Load ... |
464 |
} |
de462e5f1 bootconfig: Fix t... |
465 |
|
7684b8582 bootconfig: Load ... |
466 |
#else |
de462e5f1 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 bootconfig: Set C... |
473 474 475 |
static int __init warn_bootconfig(char *str) { |
36c6aa26e bootconfig: Fix k... |
476 477 |
pr_warn("WARNING: 'bootconfig' found on the kernel command line but CONFIG_BOOT_CONFIG is not set. "); |
d8a953ddd bootconfig: Set C... |
478 479 480 |
return 0; } early_param("bootconfig", warn_bootconfig); |
7684b8582 bootconfig: Load ... |
481 |
#endif |
a99cd1125 init: fix bug whe... |
482 |
/* Change NUL term back to "=", to make "param" the whole string. */ |
7e2762e1d init/main.c: remo... |
483 |
static void __init repair_env_string(char *param, char *val) |
1da177e4c Linux-2.6.12-rc2 |
484 |
{ |
1da177e4c 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 Linux-2.6.12-rc2 |
492 493 494 |
} else BUG(); } |
a99cd1125 init: fix bug whe... |
495 |
} |
51e158c12 param: hand argum... |
496 |
/* Anything after -- gets handed straight to init. */ |
ecc861705 module: add extra... |
497 498 |
static int __init set_init_arg(char *param, char *val, const char *unused, void *arg) |
51e158c12 param: hand argum... |
499 500 501 502 503 |
{ unsigned int i; if (panic_later) return 0; |
7e2762e1d init/main.c: remo... |
504 |
repair_env_string(param, val); |
51e158c12 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 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 module: add extra... |
520 521 |
static int __init unknown_bootoption(char *param, char *val, const char *unused, void *arg) |
a99cd1125 init: fix bug whe... |
522 |
{ |
283900e82 init/main.c: fix ... |
523 |
size_t len = strlen(param); |
7e2762e1d init/main.c: remo... |
524 |
repair_env_string(param, val); |
1da177e4c Linux-2.6.12-rc2 |
525 526 527 528 |
/* Handle obsolete-style parameters */ if (obsolete_checksetup(param)) return 0; |
f066a4f6d param: don't comp... |
529 |
/* Unused module parameter. */ |
283900e82 init/main.c: fix ... |
530 |
if (strnchr(param, len, '.')) |
1da177e4c Linux-2.6.12-rc2 |
531 |
return 0; |
1da177e4c 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 init: fix possibl... |
541 |
panic_later = "env"; |
1da177e4c Linux-2.6.12-rc2 |
542 543 |
panic_param = param; } |
283900e82 init/main.c: fix ... |
544 |
if (!strncmp(param, envp_init[i], len+1)) |
1da177e4c 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 init: fix possibl... |
553 |
panic_later = "init"; |
1da177e4c 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 [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 Linux-2.6.12-rc2 |
589 |
#ifndef CONFIG_SMP |
34db18a05 smp: move smp set... |
590 |
static const unsigned int setup_max_cpus = NR_CPUS; |
e0982e90c init: move setup ... |
591 |
static inline void setup_nr_cpu_ids(void) { } |
1da177e4c Linux-2.6.12-rc2 |
592 |
static inline void smp_prepare_cpus(unsigned int maxcpus) { } |
1da177e4c Linux-2.6.12-rc2 |
593 594 595 |
#endif /* |
30d7e0d46 [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 bootconfig: init:... |
603 |
size_t len, xlen = 0, ilen = 0; |
f5c7310ac init/main: add ch... |
604 |
|
51887d03a bootconfig: init:... |
605 606 |
if (extra_command_line) xlen = strlen(extra_command_line); |
131991620 bootconfig: init:... |
607 608 |
if (extra_init_args) ilen = strlen(extra_init_args) + 4; /* for " -- " */ |
f5c7310ac init/main: add ch... |
609 |
|
51887d03a bootconfig: init:... |
610 |
len = xlen + strlen(boot_command_line) + 1; |
f5c7310ac init/main: add ch... |
611 |
|
131991620 bootconfig: init:... |
612 |
saved_command_line = memblock_alloc(len + ilen, SMP_CACHE_BYTES); |
f5c7310ac init/main: add ch... |
613 |
if (!saved_command_line) |
131991620 bootconfig: init:... |
614 615 |
panic("%s: Failed to allocate %zu bytes ", __func__, len + ilen); |
f5c7310ac 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 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 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 bootconfig: Use p... |
640 641 642 |
if (initargs_found) { saved_command_line[len++] = ' '; } else { |
131991620 bootconfig: init:... |
643 644 |
strcpy(saved_command_line + len, " -- "); len += 4; |
f61872bb5 bootconfig: Use p... |
645 |
} |
131991620 bootconfig: init:... |
646 647 648 |
strcpy(saved_command_line + len, extra_init_args); } |
30d7e0d46 [PATCH] Dynamic k... |
649 650 651 |
} /* |
1da177e4c 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 init, sched: Fix ... |
659 |
static __initdata DECLARE_COMPLETION(kthreadd_done); |
53c99bd66 init: add arch_ca... |
660 |
noinline void __ref rest_init(void) |
1da177e4c Linux-2.6.12-rc2 |
661 |
{ |
8fb12156b init: Pin init ta... |
662 |
struct task_struct *tsk; |
73c279927 kthread: don't de... |
663 |
int pid; |
7db905e63 rcu: Move end of ... |
664 |
rcu_scheduler_starting(); |
b433c3d45 init, sched: Fix ... |
665 |
/* |
971585692 init: Fix comment |
666 |
* We need to spawn init first so that it obtains pid 1, however |
b433c3d45 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 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 Linux-2.6.12-rc2 |
680 |
numa_default_policy(); |
73c279927 kthread: don't de... |
681 |
pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); |
d11c563dd sched: Use lockde... |
682 |
rcu_read_lock(); |
5cd204550 Deprecate find_ta... |
683 |
kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns); |
d11c563dd sched: Use lockde... |
684 |
rcu_read_unlock(); |
1c3c5eab1 sched/core: Enabl... |
685 686 687 |
/* * Enable might_sleep() and smp_processor_id() checks. |
c1a280b68 sched/preempt: Us... |
688 |
* They cannot be enabled earlier because with CONFIG_PREEMPTION=y |
1c3c5eab1 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 init, sched: Fix ... |
694 |
complete(&kthreadd_done); |
f340c0d1a [PATCH] Tweak idl... |
695 696 697 |
/* * The boot idle thread must execute schedule() |
1df21055e sched: add init_i... |
698 |
* at least once to get things moving: |
f340c0d1a [PATCH] Tweak idl... |
699 |
*/ |
bd2f55361 sched/rt: Use sch... |
700 |
schedule_preempt_disabled(); |
5bfb5d690 [PATCH] sched: di... |
701 |
/* Call into cpu_idle with preempt disabled */ |
a1a04ec3c idle: Provide a g... |
702 |
cpu_startup_entry(CPUHP_ONLINE); |
1df21055e sched: add init_i... |
703 |
} |
1da177e4c Linux-2.6.12-rc2 |
704 705 |
/* Check for early params. */ |
ecc861705 module: add extra... |
706 707 |
static int __init do_early_param(char *param, char *val, const char *unused, void *arg) |
1da177e4c Linux-2.6.12-rc2 |
708 |
{ |
914dcaa84 param: make param... |
709 |
const struct obs_kernel_param *p; |
1da177e4c Linux-2.6.12-rc2 |
710 711 |
for (p = __setup_start; p < __setup_end; p++) { |
b1e4d20cb params: make dash... |
712 |
if ((p->early && parameq(param, p->str)) || |
18a8bd949 serial: convert e... |
713 714 715 |
(strcmp(param, "console") == 0 && strcmp(p->str, "earlycon") == 0) ) { |
1da177e4c Linux-2.6.12-rc2 |
716 |
if (p->setup_func(val) != 0) |
ea676e846 init/main.c: conv... |
717 718 |
pr_warn("Malformed early option '%s' ", param); |
1da177e4c Linux-2.6.12-rc2 |
719 720 721 722 723 |
} } /* We accept everything at this stage. */ return 0; } |
13977091a Driver Core: earl... |
724 725 |
void __init parse_early_options(char *cmdline) { |
ecc861705 module: add extra... |
726 727 |
parse_args("early options", cmdline, NULL, 0, 0, 0, NULL, do_early_param); |
13977091a Driver Core: earl... |
728 |
} |
1da177e4c 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 init/main.c: code... |
732 733 |
static int done __initdata; static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata; |
1da177e4c Linux-2.6.12-rc2 |
734 735 736 737 738 |
if (done) return; /* All fall through to do_early_param. */ |
30d7e0d46 [PATCH] Dynamic k... |
739 |
strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE); |
13977091a Driver Core: earl... |
740 |
parse_early_options(tmp_cmdline); |
1da177e4c Linux-2.6.12-rc2 |
741 742 |
done = 1; } |
e7ff3a476 x86/amd: Check fo... |
743 |
void __init __weak arch_post_acpi_subsys_init(void) { } |
839ad62e7 [POWERPC] Use __w... |
744 |
void __init __weak smp_setup_processor_id(void) |
033ab7f8e [PATCH] add smp_s... |
745 746 |
{ } |
eded09ccf FRV: gcc-4.1.2 al... |
747 |
# if THREAD_SIZE >= PAGE_SIZE |
b235beea9 Clarify naming of... |
748 |
void __init __weak thread_stack_cache_init(void) |
8c9843e57 [POWERPC] Add thr... |
749 750 |
{ } |
eded09ccf FRV: gcc-4.1.2 al... |
751 |
#endif |
8c9843e57 [POWERPC] Add thr... |
752 |
|
c7753208a x86, swiotlb: Add... |
753 |
void __init __weak mem_encrypt_init(void) { } |
4fc19708b x86/alternatives:... |
754 |
void __init __weak poking_init(void) { } |
782de70c4 mm: consolidate p... |
755 |
void __init __weak pgtable_cache_init(void) { } |
caa841360 x86/mm: Initializ... |
756 |
|
4e37958d1 init, tracing: Ha... |
757 758 |
bool initcall_debug; core_param(initcall_debug, initcall_debug, bool, 0644); |
b0dc52f15 init: Have initca... |
759 760 |
#ifdef TRACEPOINTS_ENABLED |
4e37958d1 init, tracing: Ha... |
761 |
static void __init initcall_debug_enable(void); |
b0dc52f15 init: Have initca... |
762 763 764 765 766 |
#else static inline void initcall_debug_enable(void) { } #endif |
4e37958d1 init, tracing: Ha... |
767 |
|
23a5c8cb7 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 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 mm: init: report ... |
776 |
else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF_ALL)) |
f0fe00d49 security: allow u... |
777 |
stack = "byref_all(zero)"; |
23a5c8cb7 mm: init: report ... |
778 |
else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_BYREF)) |
f0fe00d49 security: allow u... |
779 |
stack = "byref(zero)"; |
23a5c8cb7 mm: init: report ... |
780 |
else if (IS_ENABLED(CONFIG_GCC_PLUGIN_STRUCTLEAK_USER)) |
f0fe00d49 security: allow u... |
781 |
stack = "__user(zero)"; |
23a5c8cb7 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 init: introduce m... |
793 794 795 796 797 |
/* * Set up kernel memory allocators */ static void __init mm_init(void) { |
eefa864b7 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 mm, debug_pageall... |
803 |
init_debug_pagealloc(); |
23a5c8cb7 mm: init: report ... |
804 |
report_meminit(); |
444f478f6 init: introduce m... |
805 806 |
mem_init(); kmem_cache_init(); |
c56658681 mm: kmemleak: use... |
807 |
kmemleak_init(); |
b35f1819a mm: create a sepa... |
808 |
pgtable_init(); |
a9ee3a63d debugobjects: cal... |
809 |
debug_objects_mem_init(); |
444f478f6 init: introduce m... |
810 |
vmalloc_init(); |
0ddab1d2e lib/ioremap.c: ad... |
811 |
ioremap_huge_init(); |
613e396bc init: Invoke init... |
812 813 |
/* Should be run before the first non-init thread is created */ init_espfix_bsp(); |
aa8c6248f x86/mm/pti: Add i... |
814 815 |
/* Should be run after espfix64 is set up. */ pti_init(); |
444f478f6 init: introduce m... |
816 |
} |
53c99bd66 init: add arch_ca... |
817 818 819 820 |
void __init __weak arch_call_rest_init(void) { rest_init(); } |
f9409d58e kasan, arm64: don... |
821 |
asmlinkage __visible void __init __no_sanitize_address start_kernel(void) |
1da177e4c Linux-2.6.12-rc2 |
822 |
{ |
dd4d9fecb init/main.c: code... |
823 824 |
char *command_line; char *after_dashes; |
033ab7f8e [PATCH] add smp_s... |
825 |
|
d4311ff1a init/main.c: Give... |
826 |
set_task_stack_end_magic(&init_task); |
73839c5b2 init/main.c: Exec... |
827 |
smp_setup_processor_id(); |
3ac7fe5a4 infrastructure to... |
828 |
debug_objects_early_init(); |
420594296 x86: fix the stac... |
829 |
|
ddbcc7e8e Task Control Grou... |
830 |
cgroup_init_early(); |
fbb9ce953 [PATCH] lockdep: ... |
831 832 |
local_irq_disable(); |
2ce802f62 lockdep: Move ear... |
833 |
early_boot_irqs_disabled = true; |
fbb9ce953 [PATCH] lockdep: ... |
834 |
|
1b3b3b49b init/main: proper... |
835 836 837 838 |
/* * Interrupts are still disabled. Do necessary setups, then * enable them. */ |
44fd22992 [PATCH] Register ... |
839 |
boot_cpu_init(); |
1da177e4c Linux-2.6.12-rc2 |
840 |
page_address_init(); |
ea676e846 init/main.c: conv... |
841 |
pr_notice("%s", linux_banner); |
e6b1db98c security: Support... |
842 |
early_security_init(); |
1da177e4c Linux-2.6.12-rc2 |
843 |
setup_arch(&command_line); |
7495e0926 bootconfig: Only ... |
844 |
setup_boot_config(command_line); |
30d7e0d46 [PATCH] Dynamic k... |
845 |
setup_command_line(command_line); |
e0982e90c init: move setup ... |
846 |
setup_nr_cpu_ids(); |
d6647bdf9 init: set nr_cpu_... |
847 |
setup_per_cpu_areas(); |
44fd22992 [PATCH] Register ... |
848 |
smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */ |
b5b1404d0 init: rename and ... |
849 |
boot_cpu_hotplug_init(); |
1da177e4c Linux-2.6.12-rc2 |
850 |
|
72675e131 mm, memory_hotplu... |
851 |
build_all_zonelists(NULL); |
83b519e8b slab: setup alloc... |
852 |
page_alloc_init(); |
51887d03a bootconfig: init:... |
853 854 |
pr_notice("Kernel command line: %s ", saved_command_line); |
6041186a3 init: initialize ... |
855 856 |
/* parameters may set static keys */ jump_label_init(); |
83b519e8b slab: setup alloc... |
857 |
parse_early_param(); |
51e158c12 param: hand argum... |
858 859 860 |
after_dashes = parse_args("Booting kernel", static_command_line, __start___param, __stop___param - __start___param, |
ecc861705 module: add extra... |
861 |
-1, -1, NULL, &unknown_bootoption); |
3438cf549 param: fix crash ... |
862 |
if (!IS_ERR_OR_NULL(after_dashes)) |
51e158c12 param: hand argum... |
863 |
parse_args("Setting init args", after_dashes, NULL, 0, -1, -1, |
ecc861705 module: add extra... |
864 |
NULL, set_init_arg); |
131991620 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 jump-label: initi... |
868 |
|
83b519e8b slab: setup alloc... |
869 870 871 872 |
/* * These use large bootmem allocations and must precede * kmem_cache_init() */ |
162a7e750 printk: allocate ... |
873 |
setup_log_buf(0); |
83b519e8b slab: setup alloc... |
874 875 876 |
vfs_caches_init_early(); sort_main_extable(); trap_init(); |
444f478f6 init: introduce m... |
877 |
mm_init(); |
de03c72cf mm: convert mm->c... |
878 |
|
f631718de ftrace: Move ftra... |
879 |
ftrace_init(); |
e725c731e tracing: Split tr... |
880 881 |
/* trace_printk can be enabled here */ early_trace_init(); |
1da177e4c 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 init/main.c: code... |
893 894 895 |
if (WARN(!irqs_disabled(), "Interrupts were enabled *very* early, fixing it ")) |
c4a68306b [PATCH] start_ker... |
896 |
local_irq_disable(); |
0a835c4f0 Reimplement IDR a... |
897 |
radix_tree_init(); |
3347fa092 workqueue: make w... |
898 899 |
/* |
7d229c668 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 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 Linux-2.6.12-rc2 |
911 |
rcu_init(); |
5f893b263 tracing: Move ena... |
912 |
|
e725c731e tracing: Split tr... |
913 |
/* Trace events are available after this */ |
5f893b263 tracing: Move ena... |
914 |
trace_init(); |
4e37958d1 init, tracing: Ha... |
915 916 |
if (initcall_debug) initcall_debug_enable(); |
65f382fd0 context_tracking:... |
917 |
context_tracking_init(); |
0b8f1efad sparse irq_desc[]... |
918 919 |
/* init some links before init_ISA_irqs() */ early_irq_init(); |
1da177e4c Linux-2.6.12-rc2 |
920 |
init_IRQ(); |
ad2b13536 tick: Call tick_i... |
921 |
tick_init(); |
d6dd50e07 Merge branch 'cor... |
922 |
rcu_init_nohz(); |
1da177e4c Linux-2.6.12-rc2 |
923 |
init_timers(); |
c0a313296 [PATCH] hrtimer: ... |
924 |
hrtimers_init(); |
1da177e4c Linux-2.6.12-rc2 |
925 |
softirq_init(); |
ad596171e [PATCH] Time: Use... |
926 |
timekeeping_init(); |
d55535232 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 [PATCH] time init... |
940 |
time_init(); |
9e6302056 perf: Use hrtimer... |
941 |
perf_event_init(); |
93e028148 [PATCH] lockdep: ... |
942 |
profile_init(); |
d8ad7d112 generic-ipi: Fix ... |
943 |
call_function_init(); |
f91eb62f7 init: scream bloo... |
944 945 |
WARN(!irqs_disabled(), "Interrupts were enabled early "); |
c3bc8fd63 tracing: Centrali... |
946 |
|
2ce802f62 lockdep: Move ear... |
947 |
early_boot_irqs_disabled = false; |
93e028148 [PATCH] lockdep: ... |
948 |
local_irq_enable(); |
dcce284a2 mm: Extend gfp ma... |
949 |
|
7e85ee0c1 slab,slub: don't ... |
950 |
kmem_cache_init_late(); |
1da177e4c 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 init: fix possibl... |
959 960 |
panic("Too many boot %s vars at `%s'", panic_later, panic_param); |
fbb9ce953 [PATCH] lockdep: ... |
961 |
|
c3bc8fd63 tracing: Centrali... |
962 |
lockdep_init(); |
fbb9ce953 [PATCH] lockdep: ... |
963 |
|
9a11b49a8 [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 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 Linux-2.6.12-rc2 |
977 978 |
#ifdef CONFIG_BLK_DEV_INITRD if (initrd_start && !initrd_below_start_ok && |
bd673c7c3 initrd: cast `ini... |
979 |
page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) { |
ea676e846 init/main.c: conv... |
980 981 |
pr_crit("initrd overwritten (0x%08lx < 0x%08lx) - disabling it. ", |
bd673c7c3 initrd: cast `ini... |
982 983 |
page_to_pfn(virt_to_page((void *)initrd_start)), min_low_pfn); |
1da177e4c Linux-2.6.12-rc2 |
984 985 986 |
initrd_start = 0; } #endif |
e7c8d5c99 [PATCH] node loca... |
987 |
setup_per_cpu_pageset(); |
1da177e4c Linux-2.6.12-rc2 |
988 |
numa_policy_init(); |
9c71206d0 ACPI/init: Invoke... |
989 |
acpi_early_init(); |
1da177e4c Linux-2.6.12-rc2 |
990 991 |
if (late_time_init) late_time_init(); |
857baa87b sched/clock: Enab... |
992 |
sched_clock_init(); |
1da177e4c Linux-2.6.12-rc2 |
993 |
calibrate_delay(); |
95846ecf9 pid: replace pid ... |
994 |
pid_idr_init(); |
1da177e4c Linux-2.6.12-rc2 |
995 |
anon_vma_init(); |
11520e5e7 Revert "x86-64/ef... |
996 |
#ifdef CONFIG_X86 |
83e681897 efi: Make 'efi_en... |
997 |
if (efi_enabled(EFI_RUNTIME_SERVICES)) |
11520e5e7 Revert "x86-64/ef... |
998 999 |
efi_enter_virtual_mode(); #endif |
b235beea9 Clarify naming of... |
1000 |
thread_stack_cache_init(); |
d84f4f992 CRED: Inaugurate ... |
1001 |
cred_init(); |
ff691f6e0 kernel/fork.c: ne... |
1002 |
fork_init(); |
1da177e4c Linux-2.6.12-rc2 |
1003 |
proc_caches_init(); |
3ea056c50 uts: create "stru... |
1004 |
uts_ns_init(); |
1da177e4c Linux-2.6.12-rc2 |
1005 |
buffer_init(); |
1da177e4c Linux-2.6.12-rc2 |
1006 1007 |
key_init(); security_init(); |
0b4b3827d x86, kgdb, init: ... |
1008 |
dbg_late_init(); |
4248b0da4 fs, file table: r... |
1009 |
vfs_caches_init(); |
629060270 mm: add PageWaite... |
1010 |
pagecache_init(); |
1da177e4c Linux-2.6.12-rc2 |
1011 |
signals_init(); |
096523203 seq_file: allocat... |
1012 |
seq_file_init(); |
1da177e4c Linux-2.6.12-rc2 |
1013 |
proc_root_init(); |
e149ed2b8 take the targets ... |
1014 |
nsfs_init(); |
1da177e4c Linux-2.6.12-rc2 |
1015 |
cpuset_init(); |
695df2132 cpuset: initializ... |
1016 |
cgroup_init(); |
c757249af [PATCH] per-task-... |
1017 |
taskstats_init_early(); |
ca74e92b4 [PATCH] per-task-... |
1018 |
delayacct_init(); |
1da177e4c Linux-2.6.12-rc2 |
1019 |
|
4fc19708b x86/alternatives:... |
1020 |
poking_init(); |
1da177e4c Linux-2.6.12-rc2 |
1021 |
check_bugs(); |
b064a8fa7 ACPI / init: Swit... |
1022 |
acpi_subsystem_init(); |
e7ff3a476 x86/amd: Check fo... |
1023 |
arch_post_acpi_subsys_init(); |
6ae6996a4 SFI: add platform... |
1024 |
sfi_init_late(); |
dfd402a4c kcsan: Add Kernel... |
1025 |
kcsan_init(); |
1da177e4c Linux-2.6.12-rc2 |
1026 1027 |
/* Do the rest non-__init'ed, we're now alive */ |
53c99bd66 init: add arch_ca... |
1028 |
arch_call_rest_init(); |
a9a3ed1ef x86: Fix early bo... |
1029 1030 |
prevent_tail_call_optimization(); |
1da177e4c Linux-2.6.12-rc2 |
1031 |
} |
b99b87f70 kernel: construct... |
1032 1033 1034 1035 |
/* Call all constructor functions linked into the kernel. */ static void __init do_ctors(void) { #ifdef CONFIG_CONSTRUCTORS |
196a15b4e init/main.c: fix ... |
1036 |
ctor_fn_t *fn = (ctor_fn_t *) __ctors_start; |
b99b87f70 kernel: construct... |
1037 |
|
196a15b4e init/main.c: fix ... |
1038 1039 |
for (; fn < (ctor_fn_t *) __ctors_end; fn++) (*fn)(); |
b99b87f70 kernel: construct... |
1040 1041 |
#endif } |
7b0b73d76 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 memblock: stop us... |
1061 1062 |
entry = memblock_alloc(sizeof(*entry), SMP_CACHE_BYTES); |
f5c7310ac init/main: add ch... |
1063 1064 1065 1066 |
if (!entry) panic("%s: Failed to allocate %zu bytes ", __func__, sizeof(*entry)); |
7e1c4e279 memblock: stop us... |
1067 1068 |
entry->buf = memblock_alloc(strlen(str_entry) + 1, SMP_CACHE_BYTES); |
f5c7310ac init/main: add ch... |
1069 1070 1071 1072 |
if (!entry->buf) panic("%s: Failed to allocate %zu bytes ", __func__, strlen(str_entry) + 1); |
7b0b73d76 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 init/main.c: add ... |
1083 |
struct blacklist_entry *entry; |
c8cdd2be2 init/main.c: simp... |
1084 |
char fn_name[KSYM_SYMBOL_LEN]; |
0fd5ed8d8 init/main.c: fix ... |
1085 |
unsigned long addr; |
7b0b73d76 init/main.c: add ... |
1086 |
|
c8cdd2be2 init/main.c: simp... |
1087 |
if (list_empty(&blacklisted_initcalls)) |
7b0b73d76 init/main.c: add ... |
1088 |
return false; |
0fd5ed8d8 init/main.c: fix ... |
1089 1090 |
addr = (unsigned long) dereference_function_descriptor(fn); sprint_symbol_no_offset(fn_name, addr); |
c8cdd2be2 init/main.c: simp... |
1091 |
|
841c06d71 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 init/main.c: use ... |
1097 |
list_for_each_entry(entry, &blacklisted_initcalls, next) { |
7b0b73d76 init/main.c: add ... |
1098 1099 1100 |
if (!strcmp(fn_name, entry->buf)) { pr_debug("initcall %s blacklisted ", fn_name); |
7b0b73d76 init/main.c: add ... |
1101 1102 1103 |
return true; } } |
7b0b73d76 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 init, tracing: Ha... |
1120 1121 |
static __init_or_module void trace_initcall_start_cb(void *data, initcall_t fn) |
1da177e4c Linux-2.6.12-rc2 |
1122 |
{ |
4e37958d1 init, tracing: Ha... |
1123 |
ktime_t *calltime = (ktime_t *)data; |
1da177e4c Linux-2.6.12-rc2 |
1124 |
|
d75f773c8 treewide: Switch ... |
1125 1126 |
printk(KERN_DEBUG "calling %pS @ %i ", fn, task_pid_nr(current)); |
4e37958d1 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 init/main.c: fix ... |
1136 |
rettime = ktime_get(); |
4e37958d1 init, tracing: Ha... |
1137 |
delta = ktime_sub(rettime, *calltime); |
22c5c03b4 init/main.c: fix ... |
1138 |
duration = (unsigned long long) ktime_to_ns(delta) >> 10; |
d75f773c8 treewide: Switch ... |
1139 1140 |
printk(KERN_DEBUG "initcall %pS returned %d after %lld usecs ", |
ea676e846 init/main.c: conv... |
1141 |
fn, ret, duration); |
4e37958d1 init, tracing: Ha... |
1142 |
} |
1da177e4c Linux-2.6.12-rc2 |
1143 |
|
4e37958d1 init, tracing: Ha... |
1144 |
static ktime_t initcall_calltime; |
b0dc52f15 init: Have initca... |
1145 |
#ifdef TRACEPOINTS_ENABLED |
4e37958d1 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 init/main.c: fix ... |
1156 |
} |
b0dc52f15 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 init/main.c: fix ... |
1173 |
|
e44612713 init/main.c: mark... |
1174 |
int __init_or_module do_one_initcall(initcall_t fn) |
22c5c03b4 init/main.c: fix ... |
1175 1176 |
{ int count = preempt_count(); |
ff1c8fac8 init: remove perm... |
1177 |
char msgbuf[64]; |
4e37958d1 init, tracing: Ha... |
1178 |
int ret; |
22c5c03b4 init/main.c: fix ... |
1179 |
|
7b0b73d76 init/main.c: add ... |
1180 1181 |
if (initcall_blacklisted(fn)) return -EPERM; |
b0dc52f15 init: Have initca... |
1182 |
do_trace_initcall_start(fn); |
4e37958d1 init, tracing: Ha... |
1183 |
ret = fn(); |
b0dc52f15 init: Have initca... |
1184 |
do_trace_initcall_finish(fn, ret); |
8f0c45cdf enhance initcall_... |
1185 |
|
e0df154f4 Split up 'do_init... |
1186 |
msgbuf[0] = 0; |
e662e1cfd init: don't lose ... |
1187 |
|
e0df154f4 Split up 'do_init... |
1188 |
if (preempt_count() != count) { |
bf5d770bd init: Do not warn... |
1189 |
sprintf(msgbuf, "preemption imbalance "); |
4a2b4b222 sched: Introduce ... |
1190 |
preempt_count_set(count); |
1da177e4c Linux-2.6.12-rc2 |
1191 |
} |
e0df154f4 Split up 'do_init... |
1192 |
if (irqs_disabled()) { |
a76bfd0da initcalls: Fix m6... |
1193 |
strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf)); |
e0df154f4 Split up 'do_init... |
1194 1195 |
local_irq_enable(); } |
d75f773c8 treewide: Switch ... |
1196 1197 |
WARN(msgbuf[0], "initcall %pS returned with %s ", fn, msgbuf); |
59f9415ff modules: extend i... |
1198 |
|
38addce8b gcc-plugins: Add ... |
1199 |
add_latent_entropy(); |
30dbb20e6 tracing: Remove b... |
1200 |
return ret; |
e0df154f4 Split up 'do_init... |
1201 |
} |
1b1eeca7e 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 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 init: add comment... |
1224 |
/* Keep these in sync with initcalls in include/linux/init.h */ |
7c8f71935 init/main.c: make... |
1225 |
static const char *initcall_level_names[] __initdata = { |
a6fb6012e init: Fix initcal... |
1226 |
"pure", |
9fb48c744 params: add 3rd a... |
1227 1228 1229 1230 1231 1232 1233 |
"core", "postcore", "arch", "subsys", "fs", "device", "late", |
026cee008 params: <level>_i... |
1234 |
}; |
7e2762e1d 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 init/main.c: Allo... |
1240 |
static void __init do_initcall_level(int level, char *command_line) |
e0df154f4 Split up 'do_init... |
1241 |
{ |
1b1eeca7e init: allow initc... |
1242 |
initcall_entry_t *fn; |
e0df154f4 Split up 'do_init... |
1243 |
|
026cee008 params: <level>_i... |
1244 |
parse_args(initcall_level_names[level], |
0068c92a9 init/main.c: Allo... |
1245 |
command_line, __start___param, |
026cee008 params: <level>_i... |
1246 1247 |
__stop___param - __start___param, level, level, |
7e2762e1d init/main.c: remo... |
1248 |
NULL, ignore_unknown_bootoption); |
026cee008 params: <level>_i... |
1249 |
|
4ee7c60de init, tracing: Ad... |
1250 |
trace_initcall_level(initcall_level_names[level]); |
026cee008 params: <level>_i... |
1251 |
for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++) |
1b1eeca7e init: allow initc... |
1252 |
do_one_initcall(initcall_from_entry(fn)); |
1da177e4c Linux-2.6.12-rc2 |
1253 |
} |
026cee008 params: <level>_i... |
1254 1255 1256 |
static void __init do_initcalls(void) { int level; |
0068c92a9 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 params: <level>_i... |
1270 |
|
0068c92a9 init/main.c: Allo... |
1271 |
kfree(command_line); |
026cee008 params: <level>_i... |
1272 |
} |
1da177e4c 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 init,cpuset: fix ... |
1282 |
cpuset_init_smp(); |
1da177e4c Linux-2.6.12-rc2 |
1283 |
driver_init(); |
b04c3afb2 [PATCH] sysctl: m... |
1284 |
init_irq_proc(); |
b99b87f70 kernel: construct... |
1285 |
do_ctors(); |
d5767c535 bootup: move 'use... |
1286 |
usermodehelper_enable(); |
b0f84374b bootup: move 'use... |
1287 |
do_initcalls(); |
1da177e4c Linux-2.6.12-rc2 |
1288 |
} |
7babe8db9 Full conversion t... |
1289 |
static void __init do_pre_smp_initcalls(void) |
c2147a509 Better interface ... |
1290 |
{ |
1b1eeca7e init: allow initc... |
1291 |
initcall_entry_t *fn; |
c2147a509 Better interface ... |
1292 |
|
4ee7c60de init, tracing: Ad... |
1293 |
trace_initcall_level("early"); |
026cee008 params: <level>_i... |
1294 |
for (fn = __initcall_start; fn < __initcall0_start; fn++) |
1b1eeca7e init: allow initc... |
1295 |
do_one_initcall(initcall_from_entry(fn)); |
c2147a509 Better interface ... |
1296 |
} |
a74fb73c1 infrastructure fo... |
1297 |
static int run_init_process(const char *init_filename) |
1da177e4c Linux-2.6.12-rc2 |
1298 |
{ |
b88c50ac3 init/main.c: log ... |
1299 |
const char *const *p; |
1da177e4c Linux-2.6.12-rc2 |
1300 |
argv_init[0] = init_filename; |
3f5c15d8a init/main.c: log ... |
1301 1302 |
pr_info("Run %s as init process ", init_filename); |
b88c50ac3 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 exec: Implement k... |
1313 |
return kernel_execve(init_filename, argv_init, envp_init); |
1da177e4c Linux-2.6.12-rc2 |
1314 |
} |
ba24762bd 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 Ensure that kerne... |
1329 |
static noinline void __init kernel_init_freeable(void); |
d6b212380 make sure that we... |
1330 |
|
0f5bf6d0a arch: Rename CONF... |
1331 |
#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX) |
39290b389 module: extend 'r... |
1332 |
bool rodata_enabled __ro_after_init = true; |
d2aa1acad 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 module: extend 'r... |
1338 |
#endif |
d2aa1acad mm/init: Add 'rod... |
1339 |
|
0f5bf6d0a arch: Rename CONF... |
1340 |
#ifdef CONFIG_STRICT_KERNEL_RWX |
d2aa1acad mm/init: Add 'rod... |
1341 1342 |
static void mark_readonly(void) { |
2959a5f72 mm: add arch-inde... |
1343 |
if (rodata_enabled) { |
ae646f0b9 init: fix false p... |
1344 |
/* |
ba1803142 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 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 main: Replace rcu... |
1350 |
rcu_barrier(); |
d2aa1acad mm/init: Add 'rod... |
1351 |
mark_rodata_ro(); |
2959a5f72 mm: add arch-inde... |
1352 1353 |
rodata_test(); } else |
d2aa1acad mm/init: Add 'rod... |
1354 1355 1356 |
pr_info("Kernel memory protection disabled. "); } |
f596ded1a 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 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 init: provide a g... |
1370 1371 |
void __weak free_initmem(void) { |
f40399992 init: free_initme... |
1372 |
free_initmem_default(POISON_FREE_INITMEM); |
997aef68a init: provide a g... |
1373 |
} |
d6b212380 make sure that we... |
1374 |
static int __ref kernel_init(void *unused) |
ee5bfa642 [PATCH] generic: ... |
1375 |
{ |
ba24762bd init: make init f... |
1376 |
int ret; |
d6b212380 make sure that we... |
1377 |
kernel_init_freeable(); |
22a9d6456 async: Asynchrono... |
1378 1379 |
/* need to finish all async __init code before freeing the memory */ async_synchronize_full(); |
82d083ab6 kprobes: tracing/... |
1380 |
kprobe_free_init_mem(); |
b80f0f6c9 ftrace: Have init... |
1381 |
ftrace_free_init_mem(); |
ee5bfa642 [PATCH] generic: ... |
1382 |
free_initmem(); |
d2aa1acad mm/init: Add 'rod... |
1383 |
mark_readonly(); |
b976690f5 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 [PATCH] generic: ... |
1390 1391 |
system_state = SYSTEM_RUNNING; numa_default_policy(); |
967dcb8fe rcu: Wire up rcu_... |
1392 |
rcu_end_inkernel_boot(); |
3db978d48 kernel/sysctl: su... |
1393 |
do_sysctl_args(); |
ee5bfa642 [PATCH] generic: ... |
1394 |
if (ramdisk_execute_command) { |
ba24762bd init: make init f... |
1395 1396 |
ret = run_init_process(ramdisk_execute_command); if (!ret) |
a74fb73c1 infrastructure fo... |
1397 |
return 0; |
ba24762bd init: make init f... |
1398 1399 1400 |
pr_err("Failed to execute %s (error %d) ", ramdisk_execute_command, ret); |
ee5bfa642 [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 init: make init f... |
1410 1411 |
ret = run_init_process(execute_command); if (!ret) |
a74fb73c1 infrastructure fo... |
1412 |
return 0; |
6ef4536e2 init: allow CONFI... |
1413 1414 |
panic("Requested init %s failed (error %d).", execute_command, ret); |
ee5bfa642 [PATCH] generic: ... |
1415 |
} |
ada4ab7af 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 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 infrastructure fo... |
1430 |
return 0; |
ee5bfa642 [PATCH] generic: ... |
1431 |
|
ba24762bd init: make init f... |
1432 |
panic("No working init found. Try passing init= option to kernel. " |
8c27ceff3 docs: fix locatio... |
1433 |
"See Linux Documentation/admin-guide/init.rst for guidance."); |
ee5bfa642 [PATCH] generic: ... |
1434 |
} |
8f740636d init: open code s... |
1435 |
/* Open /dev/console, for stdin/stdout/stderr, this should never fail */ |
a94b52144 init: mark consol... |
1436 |
void __init console_on_rootfs(void) |
b49a733d6 init: unify openi... |
1437 |
{ |
8f740636d init: open code s... |
1438 |
struct file *file = filp_open("/dev/console", O_RDWR, 0); |
b49a733d6 init: unify openi... |
1439 |
|
8f740636d init: open code s... |
1440 1441 1442 1443 1444 |
if (IS_ERR(file)) { pr_err("Warning: unable to open an initial console. "); return; } |
f07353107 init: add an init... |
1445 1446 1447 1448 |
init_dup(file); init_dup(file); init_dup(file); fput(file); |
b49a733d6 init: unify openi... |
1449 |
} |
f80b0c904 Ensure that kerne... |
1450 |
static noinline void __init kernel_init_freeable(void) |
1da177e4c Linux-2.6.12-rc2 |
1451 |
{ |
b433c3d45 init, sched: Fix ... |
1452 1453 1454 1455 |
/* * Wait until kthreadd is all set-up. */ wait_for_completion(&kthreadd_done); |
31a67102f 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 cpuset,mm: update... |
1459 1460 1461 |
/* * init can allocate pages on any node */ |
3c466d46a init: use N_MEMOR... |
1462 |
set_mems_allowed(node_states[N_MEMORY]); |
1da177e4c Linux-2.6.12-rc2 |
1463 |
|
9ec52099e [PATCH] replace c... |
1464 |
cad_pid = task_pid(current); |
ca74a6f84 x86: optimize loc... |
1465 |
smp_prepare_cpus(setup_max_cpus); |
1da177e4c Linux-2.6.12-rc2 |
1466 |
|
3347fa092 workqueue: make w... |
1467 |
workqueue_init(); |
597b7305d mm: move mm_percp... |
1468 |
init_mm_internals(); |
30b491e2b rcu-tasks: Move R... |
1469 |
rcu_init_tasks_generic(); |
1da177e4c Linux-2.6.12-rc2 |
1470 |
do_pre_smp_initcalls(); |
004417a6d perf, arch: Clean... |
1471 |
lockup_detector_init(); |
1da177e4c Linux-2.6.12-rc2 |
1472 |
|
1da177e4c Linux-2.6.12-rc2 |
1473 1474 |
smp_init(); sched_init_smp(); |
f1b192b11 padata: initializ... |
1475 |
padata_init(); |
0e1cc95b4 mm: meminit: fini... |
1476 |
page_alloc_init_late(); |
2f1ee0913 Revert "mm: use e... |
1477 1478 |
/* Initialize page ext after all struct pages are initialized. */ page_ext_init(); |
0e1cc95b4 mm: meminit: fini... |
1479 |
|
1da177e4c Linux-2.6.12-rc2 |
1480 |
do_basic_setup(); |
8c0d88498 init: main: add K... |
1481 |
kunit_run_all_tests(); |
b49a733d6 init: unify openi... |
1482 |
console_on_rootfs(); |
2bd3a997b init: Open /dev/c... |
1483 |
|
1da177e4c 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 init: add an init... |
1488 |
if (init_eaccess(ramdisk_execute_command) != 0) { |
ffdfc4097 [PATCH] Add rdini... |
1489 |
ramdisk_execute_command = NULL; |
1da177e4c Linux-2.6.12-rc2 |
1490 |
prepare_namespace(); |
ffdfc4097 [PATCH] Add rdini... |
1491 |
} |
1da177e4c 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 integrity: provid... |
1497 1498 1499 |
* * rootfs is available now, try loading the public keys * and default modules |
1da177e4c Linux-2.6.12-rc2 |
1500 |
*/ |
bb813f4c9 init, block: try ... |
1501 |
|
c9cd2ce2b integrity: provid... |
1502 |
integrity_load_keys(); |
1da177e4c Linux-2.6.12-rc2 |
1503 |
} |