~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/init/main.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /init/main.c (Version linux-6.12-rc7) and /init/main.c (Version linux-6.8.12)


  1 // SPDX-License-Identifier: GPL-2.0-only            1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*                                                  2 /*
  3  *  linux/init/main.c                               3  *  linux/init/main.c
  4  *                                                  4  *
  5  *  Copyright (C) 1991, 1992  Linus Torvalds        5  *  Copyright (C) 1991, 1992  Linus Torvalds
  6  *                                                  6  *
  7  *  GK 2/5/95  -  Changed to support mounting       7  *  GK 2/5/95  -  Changed to support mounting root fs via NFS
  8  *  Added initrd & change_root: Werner Almesbe      8  *  Added initrd & change_root: Werner Almesberger & Hans Lermen, Feb '96
  9  *  Moan early if gcc is old, avoiding bogus k      9  *  Moan early if gcc is old, avoiding bogus kernels - Paul Gortmaker, May '96
 10  *  Simplified starting of init:  Michael A. G     10  *  Simplified starting of init:  Michael A. Griffith <grif@acm.org>
 11  */                                                11  */
 12                                                    12 
 13 #define DEBUG           /* Enable initcall_deb     13 #define DEBUG           /* Enable initcall_debug */
 14                                                    14 
 15 #include <linux/types.h>                           15 #include <linux/types.h>
 16 #include <linux/extable.h>                         16 #include <linux/extable.h>
 17 #include <linux/module.h>                          17 #include <linux/module.h>
 18 #include <linux/proc_fs.h>                         18 #include <linux/proc_fs.h>
 19 #include <linux/binfmts.h>                         19 #include <linux/binfmts.h>
 20 #include <linux/kernel.h>                          20 #include <linux/kernel.h>
 21 #include <linux/syscalls.h>                        21 #include <linux/syscalls.h>
 22 #include <linux/stackprotector.h>                  22 #include <linux/stackprotector.h>
 23 #include <linux/string.h>                          23 #include <linux/string.h>
 24 #include <linux/ctype.h>                           24 #include <linux/ctype.h>
 25 #include <linux/delay.h>                           25 #include <linux/delay.h>
 26 #include <linux/ioport.h>                          26 #include <linux/ioport.h>
 27 #include <linux/init.h>                            27 #include <linux/init.h>
 28 #include <linux/initrd.h>                          28 #include <linux/initrd.h>
 29 #include <linux/memblock.h>                        29 #include <linux/memblock.h>
 30 #include <linux/acpi.h>                            30 #include <linux/acpi.h>
 31 #include <linux/bootconfig.h>                      31 #include <linux/bootconfig.h>
 32 #include <linux/console.h>                         32 #include <linux/console.h>
 33 #include <linux/nmi.h>                             33 #include <linux/nmi.h>
 34 #include <linux/percpu.h>                          34 #include <linux/percpu.h>
 35 #include <linux/kmod.h>                            35 #include <linux/kmod.h>
 36 #include <linux/kprobes.h>                         36 #include <linux/kprobes.h>
 37 #include <linux/kmsan.h>                           37 #include <linux/kmsan.h>
 38 #include <linux/vmalloc.h>                         38 #include <linux/vmalloc.h>
 39 #include <linux/kernel_stat.h>                     39 #include <linux/kernel_stat.h>
 40 #include <linux/start_kernel.h>                    40 #include <linux/start_kernel.h>
 41 #include <linux/security.h>                        41 #include <linux/security.h>
 42 #include <linux/smp.h>                             42 #include <linux/smp.h>
 43 #include <linux/profile.h>                         43 #include <linux/profile.h>
 44 #include <linux/kfence.h>                          44 #include <linux/kfence.h>
 45 #include <linux/rcupdate.h>                        45 #include <linux/rcupdate.h>
 46 #include <linux/srcu.h>                            46 #include <linux/srcu.h>
 47 #include <linux/moduleparam.h>                     47 #include <linux/moduleparam.h>
 48 #include <linux/kallsyms.h>                        48 #include <linux/kallsyms.h>
 49 #include <linux/buildid.h>                         49 #include <linux/buildid.h>
 50 #include <linux/writeback.h>                       50 #include <linux/writeback.h>
 51 #include <linux/cpu.h>                             51 #include <linux/cpu.h>
 52 #include <linux/cpuset.h>                          52 #include <linux/cpuset.h>
 53 #include <linux/cgroup.h>                          53 #include <linux/cgroup.h>
 54 #include <linux/efi.h>                             54 #include <linux/efi.h>
 55 #include <linux/tick.h>                            55 #include <linux/tick.h>
 56 #include <linux/sched/isolation.h>                 56 #include <linux/sched/isolation.h>
 57 #include <linux/interrupt.h>                       57 #include <linux/interrupt.h>
 58 #include <linux/taskstats_kern.h>                  58 #include <linux/taskstats_kern.h>
 59 #include <linux/delayacct.h>                       59 #include <linux/delayacct.h>
 60 #include <linux/unistd.h>                          60 #include <linux/unistd.h>
 61 #include <linux/utsname.h>                         61 #include <linux/utsname.h>
 62 #include <linux/rmap.h>                            62 #include <linux/rmap.h>
 63 #include <linux/mempolicy.h>                       63 #include <linux/mempolicy.h>
 64 #include <linux/key.h>                             64 #include <linux/key.h>
 65 #include <linux/debug_locks.h>                     65 #include <linux/debug_locks.h>
 66 #include <linux/debugobjects.h>                    66 #include <linux/debugobjects.h>
 67 #include <linux/lockdep.h>                         67 #include <linux/lockdep.h>
 68 #include <linux/kmemleak.h>                        68 #include <linux/kmemleak.h>
 69 #include <linux/padata.h>                          69 #include <linux/padata.h>
 70 #include <linux/pid_namespace.h>                   70 #include <linux/pid_namespace.h>
 71 #include <linux/device/driver.h>                   71 #include <linux/device/driver.h>
 72 #include <linux/kthread.h>                         72 #include <linux/kthread.h>
 73 #include <linux/sched.h>                           73 #include <linux/sched.h>
 74 #include <linux/sched/init.h>                      74 #include <linux/sched/init.h>
 75 #include <linux/signal.h>                          75 #include <linux/signal.h>
 76 #include <linux/idr.h>                             76 #include <linux/idr.h>
 77 #include <linux/kgdb.h>                            77 #include <linux/kgdb.h>
 78 #include <linux/ftrace.h>                          78 #include <linux/ftrace.h>
 79 #include <linux/async.h>                           79 #include <linux/async.h>
 80 #include <linux/shmem_fs.h>                        80 #include <linux/shmem_fs.h>
 81 #include <linux/slab.h>                            81 #include <linux/slab.h>
 82 #include <linux/perf_event.h>                      82 #include <linux/perf_event.h>
 83 #include <linux/ptrace.h>                          83 #include <linux/ptrace.h>
 84 #include <linux/pti.h>                             84 #include <linux/pti.h>
 85 #include <linux/blkdev.h>                          85 #include <linux/blkdev.h>
 86 #include <linux/sched/clock.h>                     86 #include <linux/sched/clock.h>
 87 #include <linux/sched/task.h>                      87 #include <linux/sched/task.h>
 88 #include <linux/sched/task_stack.h>                88 #include <linux/sched/task_stack.h>
 89 #include <linux/context_tracking.h>                89 #include <linux/context_tracking.h>
 90 #include <linux/random.h>                          90 #include <linux/random.h>
 91 #include <linux/moduleloader.h>                    91 #include <linux/moduleloader.h>
 92 #include <linux/list.h>                            92 #include <linux/list.h>
 93 #include <linux/integrity.h>                       93 #include <linux/integrity.h>
 94 #include <linux/proc_ns.h>                         94 #include <linux/proc_ns.h>
 95 #include <linux/io.h>                              95 #include <linux/io.h>
 96 #include <linux/cache.h>                           96 #include <linux/cache.h>
 97 #include <linux/rodata_test.h>                     97 #include <linux/rodata_test.h>
 98 #include <linux/jump_label.h>                      98 #include <linux/jump_label.h>
 99 #include <linux/kcsan.h>                           99 #include <linux/kcsan.h>
100 #include <linux/init_syscalls.h>                  100 #include <linux/init_syscalls.h>
101 #include <linux/stackdepot.h>                     101 #include <linux/stackdepot.h>
102 #include <linux/randomize_kstack.h>               102 #include <linux/randomize_kstack.h>
103 #include <linux/pidfs.h>                       << 
104 #include <linux/ptdump.h>                      << 
105 #include <net/net_namespace.h>                    103 #include <net/net_namespace.h>
106                                                   104 
107 #include <asm/io.h>                               105 #include <asm/io.h>
108 #include <asm/setup.h>                            106 #include <asm/setup.h>
109 #include <asm/sections.h>                         107 #include <asm/sections.h>
110 #include <asm/cacheflush.h>                       108 #include <asm/cacheflush.h>
111                                                   109 
112 #define CREATE_TRACE_POINTS                       110 #define CREATE_TRACE_POINTS
113 #include <trace/events/initcall.h>                111 #include <trace/events/initcall.h>
114                                                   112 
115 #include <kunit/test.h>                           113 #include <kunit/test.h>
116                                                   114 
117 static int kernel_init(void *);                   115 static int kernel_init(void *);
118                                                   116 
119 /*                                                117 /*
120  * Debug helper: via this flag we know that we    118  * Debug helper: via this flag we know that we are in 'early bootup code'
121  * where only the boot processor is running wi    119  * where only the boot processor is running with IRQ disabled.  This means
122  * two things - IRQ must not be enabled before    120  * two things - IRQ must not be enabled before the flag is cleared and some
123  * operations which are not allowed with IRQ d    121  * operations which are not allowed with IRQ disabled are allowed while the
124  * flag is set.                                   122  * flag is set.
125  */                                               123  */
126 bool early_boot_irqs_disabled __read_mostly;      124 bool early_boot_irqs_disabled __read_mostly;
127                                                   125 
128 enum system_states system_state __read_mostly;    126 enum system_states system_state __read_mostly;
129 EXPORT_SYMBOL(system_state);                      127 EXPORT_SYMBOL(system_state);
130                                                   128 
131 /*                                                129 /*
132  * Boot command-line arguments                    130  * Boot command-line arguments
133  */                                               131  */
134 #define MAX_INIT_ARGS CONFIG_INIT_ENV_ARG_LIMI    132 #define MAX_INIT_ARGS CONFIG_INIT_ENV_ARG_LIMIT
135 #define MAX_INIT_ENVS CONFIG_INIT_ENV_ARG_LIMI    133 #define MAX_INIT_ENVS CONFIG_INIT_ENV_ARG_LIMIT
136                                                   134 
137 /* Default late time init is NULL. archs can o    135 /* Default late time init is NULL. archs can override this later. */
138 void (*__initdata late_time_init)(void);          136 void (*__initdata late_time_init)(void);
139                                                   137 
140 /* Untouched command line saved by arch-specif    138 /* Untouched command line saved by arch-specific code. */
141 char __initdata boot_command_line[COMMAND_LINE    139 char __initdata boot_command_line[COMMAND_LINE_SIZE];
142 /* Untouched saved command line (eg. for /proc    140 /* Untouched saved command line (eg. for /proc) */
143 char *saved_command_line __ro_after_init;         141 char *saved_command_line __ro_after_init;
144 unsigned int saved_command_line_len __ro_after    142 unsigned int saved_command_line_len __ro_after_init;
145 /* Command line for parameter parsing */          143 /* Command line for parameter parsing */
146 static char *static_command_line;                 144 static char *static_command_line;
147 /* Untouched extra command line */                145 /* Untouched extra command line */
148 static char *extra_command_line;                  146 static char *extra_command_line;
149 /* Extra init arguments */                        147 /* Extra init arguments */
150 static char *extra_init_args;                     148 static char *extra_init_args;
151                                                   149 
152 #ifdef CONFIG_BOOT_CONFIG                         150 #ifdef CONFIG_BOOT_CONFIG
153 /* Is bootconfig on command line? */              151 /* Is bootconfig on command line? */
154 static bool bootconfig_found;                     152 static bool bootconfig_found;
155 static size_t initargs_offs;                      153 static size_t initargs_offs;
156 #else                                             154 #else
157 # define bootconfig_found false                   155 # define bootconfig_found false
158 # define initargs_offs 0                          156 # define initargs_offs 0
159 #endif                                            157 #endif
160                                                   158 
161 static char *execute_command;                     159 static char *execute_command;
162 static char *ramdisk_execute_command = "/init"    160 static char *ramdisk_execute_command = "/init";
163                                                   161 
164 /*                                                162 /*
165  * Used to generate warnings if static_key man    163  * Used to generate warnings if static_key manipulation functions are used
166  * before jump_label_init is called.              164  * before jump_label_init is called.
167  */                                               165  */
168 bool static_key_initialized __read_mostly;        166 bool static_key_initialized __read_mostly;
169 EXPORT_SYMBOL_GPL(static_key_initialized);        167 EXPORT_SYMBOL_GPL(static_key_initialized);
170                                                   168 
171 /*                                                169 /*
172  * If set, this is an indication to the driver    170  * If set, this is an indication to the drivers that reset the underlying
173  * device before going ahead with the initiali    171  * device before going ahead with the initialization otherwise driver might
174  * rely on the BIOS and skip the reset operati    172  * rely on the BIOS and skip the reset operation.
175  *                                                173  *
176  * This is useful if kernel is booting in an u    174  * This is useful if kernel is booting in an unreliable environment.
177  * For ex. kdump situation where previous kern    175  * For ex. kdump situation where previous kernel has crashed, BIOS has been
178  * skipped and devices will be in unknown stat    176  * skipped and devices will be in unknown state.
179  */                                               177  */
180 unsigned int reset_devices;                       178 unsigned int reset_devices;
181 EXPORT_SYMBOL(reset_devices);                     179 EXPORT_SYMBOL(reset_devices);
182                                                   180 
183 static int __init set_reset_devices(char *str)    181 static int __init set_reset_devices(char *str)
184 {                                                 182 {
185         reset_devices = 1;                        183         reset_devices = 1;
186         return 1;                                 184         return 1;
187 }                                                 185 }
188                                                   186 
189 __setup("reset_devices", set_reset_devices);      187 __setup("reset_devices", set_reset_devices);
190                                                   188 
191 static const char *argv_init[MAX_INIT_ARGS+2]     189 static const char *argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
192 const char *envp_init[MAX_INIT_ENVS+2] = { "HO    190 const char *envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };
193 static const char *panic_later, *panic_param;     191 static const char *panic_later, *panic_param;
194                                                   192 
195 static bool __init obsolete_checksetup(char *l    193 static bool __init obsolete_checksetup(char *line)
196 {                                                 194 {
197         const struct obs_kernel_param *p;         195         const struct obs_kernel_param *p;
198         bool had_early_param = false;             196         bool had_early_param = false;
199                                                   197 
200         p = __setup_start;                        198         p = __setup_start;
201         do {                                      199         do {
202                 int n = strlen(p->str);           200                 int n = strlen(p->str);
203                 if (parameqn(line, p->str, n))    201                 if (parameqn(line, p->str, n)) {
204                         if (p->early) {           202                         if (p->early) {
205                                 /* Already don    203                                 /* Already done in parse_early_param?
206                                  * (Needs exac    204                                  * (Needs exact match on param part).
207                                  * Keep iterat    205                                  * Keep iterating, as we can have early
208                                  * params and     206                                  * params and __setups of same names 8( */
209                                 if (line[n] ==    207                                 if (line[n] == '\0' || line[n] == '=')
210                                         had_ea    208                                         had_early_param = true;
211                         } else if (!p->setup_f    209                         } else if (!p->setup_func) {
212                                 pr_warn("Param    210                                 pr_warn("Parameter %s is obsolete, ignored\n",
213                                         p->str    211                                         p->str);
214                                 return true;      212                                 return true;
215                         } else if (p->setup_fu    213                         } else if (p->setup_func(line + n))
216                                 return true;      214                                 return true;
217                 }                                 215                 }
218                 p++;                              216                 p++;
219         } while (p < __setup_end);                217         } while (p < __setup_end);
220                                                   218 
221         return had_early_param;                   219         return had_early_param;
222 }                                                 220 }
223                                                   221 
224 /*                                                222 /*
225  * This should be approx 2 Bo*oMips to start (    223  * This should be approx 2 Bo*oMips to start (note initial shift), and will
226  * still work even if initially too large, it     224  * still work even if initially too large, it will just take slightly longer
227  */                                               225  */
228 unsigned long loops_per_jiffy = (1<<12);          226 unsigned long loops_per_jiffy = (1<<12);
229 EXPORT_SYMBOL(loops_per_jiffy);                   227 EXPORT_SYMBOL(loops_per_jiffy);
230                                                   228 
231 static int __init debug_kernel(char *str)         229 static int __init debug_kernel(char *str)
232 {                                                 230 {
233         console_loglevel = CONSOLE_LOGLEVEL_DE    231         console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
234         return 0;                                 232         return 0;
235 }                                                 233 }
236                                                   234 
237 static int __init quiet_kernel(char *str)         235 static int __init quiet_kernel(char *str)
238 {                                                 236 {
239         console_loglevel = CONSOLE_LOGLEVEL_QU    237         console_loglevel = CONSOLE_LOGLEVEL_QUIET;
240         return 0;                                 238         return 0;
241 }                                                 239 }
242                                                   240 
243 early_param("debug", debug_kernel);               241 early_param("debug", debug_kernel);
244 early_param("quiet", quiet_kernel);               242 early_param("quiet", quiet_kernel);
245                                                   243 
246 static int __init loglevel(char *str)             244 static int __init loglevel(char *str)
247 {                                                 245 {
248         int newlevel;                             246         int newlevel;
249                                                   247 
250         /*                                        248         /*
251          * Only update loglevel value when a c    249          * Only update loglevel value when a correct setting was passed,
252          * to prevent blind crashes (when logl    250          * to prevent blind crashes (when loglevel being set to 0) that
253          * are quite hard to debug                251          * are quite hard to debug
254          */                                       252          */
255         if (get_option(&str, &newlevel)) {        253         if (get_option(&str, &newlevel)) {
256                 console_loglevel = newlevel;      254                 console_loglevel = newlevel;
257                 return 0;                         255                 return 0;
258         }                                         256         }
259                                                   257 
260         return -EINVAL;                           258         return -EINVAL;
261 }                                                 259 }
262                                                   260 
263 early_param("loglevel", loglevel);                261 early_param("loglevel", loglevel);
264                                                   262 
265 #ifdef CONFIG_BLK_DEV_INITRD                      263 #ifdef CONFIG_BLK_DEV_INITRD
266 static void * __init get_boot_config_from_init    264 static void * __init get_boot_config_from_initrd(size_t *_size)
267 {                                                 265 {
268         u32 size, csum;                           266         u32 size, csum;
269         char *data;                               267         char *data;
270         u32 *hdr;                                 268         u32 *hdr;
271         int i;                                    269         int i;
272                                                   270 
273         if (!initrd_end)                          271         if (!initrd_end)
274                 return NULL;                      272                 return NULL;
275                                                   273 
276         data = (char *)initrd_end - BOOTCONFIG    274         data = (char *)initrd_end - BOOTCONFIG_MAGIC_LEN;
277         /*                                        275         /*
278          * Since Grub may align the size of in    276          * Since Grub may align the size of initrd to 4, we must
279          * check the preceding 3 bytes as well    277          * check the preceding 3 bytes as well.
280          */                                       278          */
281         for (i = 0; i < 4; i++) {                 279         for (i = 0; i < 4; i++) {
282                 if (!memcmp(data, BOOTCONFIG_M    280                 if (!memcmp(data, BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_LEN))
283                         goto found;               281                         goto found;
284                 data--;                           282                 data--;
285         }                                         283         }
286         return NULL;                              284         return NULL;
287                                                   285 
288 found:                                            286 found:
289         hdr = (u32 *)(data - 8);                  287         hdr = (u32 *)(data - 8);
290         size = le32_to_cpu(hdr[0]);               288         size = le32_to_cpu(hdr[0]);
291         csum = le32_to_cpu(hdr[1]);               289         csum = le32_to_cpu(hdr[1]);
292                                                   290 
293         data = ((void *)hdr) - size;              291         data = ((void *)hdr) - size;
294         if ((unsigned long)data < initrd_start    292         if ((unsigned long)data < initrd_start) {
295                 pr_err("bootconfig size %d is     293                 pr_err("bootconfig size %d is greater than initrd size %ld\n",
296                         size, initrd_end - ini    294                         size, initrd_end - initrd_start);
297                 return NULL;                      295                 return NULL;
298         }                                         296         }
299                                                   297 
300         if (xbc_calc_checksum(data, size) != c    298         if (xbc_calc_checksum(data, size) != csum) {
301                 pr_err("bootconfig checksum fa    299                 pr_err("bootconfig checksum failed\n");
302                 return NULL;                      300                 return NULL;
303         }                                         301         }
304                                                   302 
305         /* Remove bootconfig from initramfs/in    303         /* Remove bootconfig from initramfs/initrd */
306         initrd_end = (unsigned long)data;         304         initrd_end = (unsigned long)data;
307         if (_size)                                305         if (_size)
308                 *_size = size;                    306                 *_size = size;
309                                                   307 
310         return data;                              308         return data;
311 }                                                 309 }
312 #else                                             310 #else
313 static void * __init get_boot_config_from_init    311 static void * __init get_boot_config_from_initrd(size_t *_size)
314 {                                                 312 {
315         return NULL;                              313         return NULL;
316 }                                                 314 }
317 #endif                                            315 #endif
318                                                   316 
319 #ifdef CONFIG_BOOT_CONFIG                         317 #ifdef CONFIG_BOOT_CONFIG
320                                                   318 
321 static char xbc_namebuf[XBC_KEYLEN_MAX] __init    319 static char xbc_namebuf[XBC_KEYLEN_MAX] __initdata;
322                                                   320 
323 #define rest(dst, end) ((end) > (dst) ? (end)     321 #define rest(dst, end) ((end) > (dst) ? (end) - (dst) : 0)
324                                                   322 
325 static int __init xbc_snprint_cmdline(char *bu    323 static int __init xbc_snprint_cmdline(char *buf, size_t size,
326                                       struct x    324                                       struct xbc_node *root)
327 {                                                 325 {
328         struct xbc_node *knode, *vnode;           326         struct xbc_node *knode, *vnode;
329         char *end = buf + size;                   327         char *end = buf + size;
330         const char *val, *q;                   !! 328         const char *val;
331         int ret;                                  329         int ret;
332                                                   330 
333         xbc_node_for_each_key_value(root, knod    331         xbc_node_for_each_key_value(root, knode, val) {
334                 ret = xbc_node_compose_key_aft    332                 ret = xbc_node_compose_key_after(root, knode,
335                                         xbc_na    333                                         xbc_namebuf, XBC_KEYLEN_MAX);
336                 if (ret < 0)                      334                 if (ret < 0)
337                         return ret;               335                         return ret;
338                                                   336 
339                 vnode = xbc_node_get_child(kno    337                 vnode = xbc_node_get_child(knode);
340                 if (!vnode) {                     338                 if (!vnode) {
341                         ret = snprintf(buf, re    339                         ret = snprintf(buf, rest(buf, end), "%s ", xbc_namebuf);
342                         if (ret < 0)              340                         if (ret < 0)
343                                 return ret;       341                                 return ret;
344                         buf += ret;               342                         buf += ret;
345                         continue;                 343                         continue;
346                 }                                 344                 }
347                 xbc_array_for_each_value(vnode    345                 xbc_array_for_each_value(vnode, val) {
348                         /*                     !! 346                         ret = snprintf(buf, rest(buf, end), "%s=\"%s\" ",
349                          * For prettier and mo !! 347                                        xbc_namebuf, val);
350                          * quote the value whe << 
351                          * whitespace.         << 
352                          */                    << 
353                         q = strpbrk(val, " \t\ << 
354                         ret = snprintf(buf, re << 
355                                        xbc_nam << 
356                         if (ret < 0)              348                         if (ret < 0)
357                                 return ret;       349                                 return ret;
358                         buf += ret;               350                         buf += ret;
359                 }                                 351                 }
360         }                                         352         }
361                                                   353 
362         return buf - (end - size);                354         return buf - (end - size);
363 }                                                 355 }
364 #undef rest                                       356 #undef rest
365                                                   357 
366 /* Make an extra command line under given key     358 /* Make an extra command line under given key word */
367 static char * __init xbc_make_cmdline(const ch    359 static char * __init xbc_make_cmdline(const char *key)
368 {                                                 360 {
369         struct xbc_node *root;                    361         struct xbc_node *root;
370         char *new_cmdline;                        362         char *new_cmdline;
371         int ret, len = 0;                         363         int ret, len = 0;
372                                                   364 
373         root = xbc_find_node(key);                365         root = xbc_find_node(key);
374         if (!root)                                366         if (!root)
375                 return NULL;                      367                 return NULL;
376                                                   368 
377         /* Count required buffer size */          369         /* Count required buffer size */
378         len = xbc_snprint_cmdline(NULL, 0, roo    370         len = xbc_snprint_cmdline(NULL, 0, root);
379         if (len <= 0)                             371         if (len <= 0)
380                 return NULL;                      372                 return NULL;
381                                                   373 
382         new_cmdline = memblock_alloc(len + 1,     374         new_cmdline = memblock_alloc(len + 1, SMP_CACHE_BYTES);
383         if (!new_cmdline) {                       375         if (!new_cmdline) {
384                 pr_err("Failed to allocate mem    376                 pr_err("Failed to allocate memory for extra kernel cmdline.\n");
385                 return NULL;                      377                 return NULL;
386         }                                         378         }
387                                                   379 
388         ret = xbc_snprint_cmdline(new_cmdline,    380         ret = xbc_snprint_cmdline(new_cmdline, len + 1, root);
389         if (ret < 0 || ret > len) {               381         if (ret < 0 || ret > len) {
390                 pr_err("Failed to print extra     382                 pr_err("Failed to print extra kernel cmdline.\n");
391                 memblock_free(new_cmdline, len    383                 memblock_free(new_cmdline, len + 1);
392                 return NULL;                      384                 return NULL;
393         }                                         385         }
394                                                   386 
395         return new_cmdline;                       387         return new_cmdline;
396 }                                                 388 }
397                                                   389 
398 static int __init bootconfig_params(char *para    390 static int __init bootconfig_params(char *param, char *val,
399                                     const char    391                                     const char *unused, void *arg)
400 {                                                 392 {
401         if (strcmp(param, "bootconfig") == 0)     393         if (strcmp(param, "bootconfig") == 0) {
402                 bootconfig_found = true;          394                 bootconfig_found = true;
403         }                                         395         }
404         return 0;                                 396         return 0;
405 }                                                 397 }
406                                                   398 
407 static int __init warn_bootconfig(char *str)      399 static int __init warn_bootconfig(char *str)
408 {                                                 400 {
409         /* The 'bootconfig' has been handled b    401         /* The 'bootconfig' has been handled by bootconfig_params(). */
410         return 0;                                 402         return 0;
411 }                                                 403 }
412                                                   404 
413 static void __init setup_boot_config(void)        405 static void __init setup_boot_config(void)
414 {                                                 406 {
415         static char tmp_cmdline[COMMAND_LINE_S    407         static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata;
416         const char *msg, *data;                   408         const char *msg, *data;
417         int pos, ret;                             409         int pos, ret;
418         size_t size;                              410         size_t size;
419         char *err;                                411         char *err;
420                                                   412 
421         /* Cut out the bootconfig data even if    413         /* Cut out the bootconfig data even if we have no bootconfig option */
422         data = get_boot_config_from_initrd(&si    414         data = get_boot_config_from_initrd(&size);
423         /* If there is no bootconfig in initrd    415         /* If there is no bootconfig in initrd, try embedded one. */
424         if (!data)                                416         if (!data)
425                 data = xbc_get_embedded_bootco    417                 data = xbc_get_embedded_bootconfig(&size);
426                                                   418 
427         strscpy(tmp_cmdline, boot_command_line    419         strscpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
428         err = parse_args("bootconfig", tmp_cmd    420         err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL,
429                          bootconfig_params);      421                          bootconfig_params);
430                                                   422 
431         if (IS_ERR(err) || !(bootconfig_found     423         if (IS_ERR(err) || !(bootconfig_found || IS_ENABLED(CONFIG_BOOT_CONFIG_FORCE)))
432                 return;                           424                 return;
433                                                   425 
434         /* parse_args() stops at the next para    426         /* parse_args() stops at the next param of '--' and returns an address */
435         if (err)                                  427         if (err)
436                 initargs_offs = err - tmp_cmdl    428                 initargs_offs = err - tmp_cmdline;
437                                                   429 
438         if (!data) {                              430         if (!data) {
439                 /* If user intended to use boo    431                 /* If user intended to use bootconfig, show an error level message */
440                 if (bootconfig_found)             432                 if (bootconfig_found)
441                         pr_err("'bootconfig' f    433                         pr_err("'bootconfig' found on command line, but no bootconfig found\n");
442                 else                              434                 else
443                         pr_info("No bootconfig    435                         pr_info("No bootconfig data provided, so skipping bootconfig");
444                 return;                           436                 return;
445         }                                         437         }
446                                                   438 
447         if (size >= XBC_DATA_MAX) {               439         if (size >= XBC_DATA_MAX) {
448                 pr_err("bootconfig size %ld gr    440                 pr_err("bootconfig size %ld greater than max size %d\n",
449                         (long)size, XBC_DATA_M    441                         (long)size, XBC_DATA_MAX);
450                 return;                           442                 return;
451         }                                         443         }
452                                                   444 
453         ret = xbc_init(data, size, &msg, &pos)    445         ret = xbc_init(data, size, &msg, &pos);
454         if (ret < 0) {                            446         if (ret < 0) {
455                 if (pos < 0)                      447                 if (pos < 0)
456                         pr_err("Failed to init    448                         pr_err("Failed to init bootconfig: %s.\n", msg);
457                 else                              449                 else
458                         pr_err("Failed to pars    450                         pr_err("Failed to parse bootconfig: %s at %d.\n",
459                                 msg, pos);        451                                 msg, pos);
460         } else {                                  452         } else {
461                 xbc_get_info(&ret, NULL);         453                 xbc_get_info(&ret, NULL);
462                 pr_info("Load bootconfig: %ld     454                 pr_info("Load bootconfig: %ld bytes %d nodes\n", (long)size, ret);
463                 /* keys starting with "kernel.    455                 /* keys starting with "kernel." are passed via cmdline */
464                 extra_command_line = xbc_make_    456                 extra_command_line = xbc_make_cmdline("kernel");
465                 /* Also, "init." keys are init    457                 /* Also, "init." keys are init arguments */
466                 extra_init_args = xbc_make_cmd    458                 extra_init_args = xbc_make_cmdline("init");
467         }                                         459         }
468         return;                                   460         return;
469 }                                                 461 }
470                                                   462 
471 static void __init exit_boot_config(void)         463 static void __init exit_boot_config(void)
472 {                                                 464 {
473         xbc_exit();                               465         xbc_exit();
474 }                                                 466 }
475                                                   467 
476 #else   /* !CONFIG_BOOT_CONFIG */                 468 #else   /* !CONFIG_BOOT_CONFIG */
477                                                   469 
478 static void __init setup_boot_config(void)        470 static void __init setup_boot_config(void)
479 {                                                 471 {
480         /* Remove bootconfig data from initrd     472         /* Remove bootconfig data from initrd */
481         get_boot_config_from_initrd(NULL);        473         get_boot_config_from_initrd(NULL);
482 }                                                 474 }
483                                                   475 
484 static int __init warn_bootconfig(char *str)      476 static int __init warn_bootconfig(char *str)
485 {                                                 477 {
486         pr_warn("WARNING: 'bootconfig' found o    478         pr_warn("WARNING: 'bootconfig' found on the kernel command line but CONFIG_BOOT_CONFIG is not set.\n");
487         return 0;                                 479         return 0;
488 }                                                 480 }
489                                                   481 
490 #define exit_boot_config()      do {} while (0    482 #define exit_boot_config()      do {} while (0)
491                                                   483 
492 #endif  /* CONFIG_BOOT_CONFIG */                  484 #endif  /* CONFIG_BOOT_CONFIG */
493                                                   485 
494 early_param("bootconfig", warn_bootconfig);       486 early_param("bootconfig", warn_bootconfig);
495                                                   487 
496 bool __init cmdline_has_extra_options(void)       488 bool __init cmdline_has_extra_options(void)
497 {                                                 489 {
498         return extra_command_line || extra_ini    490         return extra_command_line || extra_init_args;
499 }                                                 491 }
500                                                   492 
501 /* Change NUL term back to "=", to make "param    493 /* Change NUL term back to "=", to make "param" the whole string. */
502 static void __init repair_env_string(char *par    494 static void __init repair_env_string(char *param, char *val)
503 {                                                 495 {
504         if (val) {                                496         if (val) {
505                 /* param=val or param="val"? *    497                 /* param=val or param="val"? */
506                 if (val == param+strlen(param)    498                 if (val == param+strlen(param)+1)
507                         val[-1] = '=';            499                         val[-1] = '=';
508                 else if (val == param+strlen(p    500                 else if (val == param+strlen(param)+2) {
509                         val[-2] = '=';            501                         val[-2] = '=';
510                         memmove(val-1, val, st    502                         memmove(val-1, val, strlen(val)+1);
511                 } else                            503                 } else
512                         BUG();                    504                         BUG();
513         }                                         505         }
514 }                                                 506 }
515                                                   507 
516 /* Anything after -- gets handed straight to i    508 /* Anything after -- gets handed straight to init. */
517 static int __init set_init_arg(char *param, ch    509 static int __init set_init_arg(char *param, char *val,
518                                const char *unu    510                                const char *unused, void *arg)
519 {                                                 511 {
520         unsigned int i;                           512         unsigned int i;
521                                                   513 
522         if (panic_later)                          514         if (panic_later)
523                 return 0;                         515                 return 0;
524                                                   516 
525         repair_env_string(param, val);            517         repair_env_string(param, val);
526                                                   518 
527         for (i = 0; argv_init[i]; i++) {          519         for (i = 0; argv_init[i]; i++) {
528                 if (i == MAX_INIT_ARGS) {         520                 if (i == MAX_INIT_ARGS) {
529                         panic_later = "init";     521                         panic_later = "init";
530                         panic_param = param;      522                         panic_param = param;
531                         return 0;                 523                         return 0;
532                 }                                 524                 }
533         }                                         525         }
534         argv_init[i] = param;                     526         argv_init[i] = param;
535         return 0;                                 527         return 0;
536 }                                                 528 }
537                                                   529 
538 /*                                                530 /*
539  * Unknown boot options get handed to init, un    531  * Unknown boot options get handed to init, unless they look like
540  * unused parameters (modprobe will find them     532  * unused parameters (modprobe will find them in /proc/cmdline).
541  */                                               533  */
542 static int __init unknown_bootoption(char *par    534 static int __init unknown_bootoption(char *param, char *val,
543                                      const cha    535                                      const char *unused, void *arg)
544 {                                                 536 {
545         size_t len = strlen(param);               537         size_t len = strlen(param);
546                                                   538 
547         /* Handle params aliased to sysctls */    539         /* Handle params aliased to sysctls */
548         if (sysctl_is_alias(param))               540         if (sysctl_is_alias(param))
549                 return 0;                         541                 return 0;
550                                                   542 
551         repair_env_string(param, val);            543         repair_env_string(param, val);
552                                                   544 
553         /* Handle obsolete-style parameters */    545         /* Handle obsolete-style parameters */
554         if (obsolete_checksetup(param))           546         if (obsolete_checksetup(param))
555                 return 0;                         547                 return 0;
556                                                   548 
557         /* Unused module parameter. */            549         /* Unused module parameter. */
558         if (strnchr(param, len, '.'))             550         if (strnchr(param, len, '.'))
559                 return 0;                         551                 return 0;
560                                                   552 
561         if (panic_later)                          553         if (panic_later)
562                 return 0;                         554                 return 0;
563                                                   555 
564         if (val) {                                556         if (val) {
565                 /* Environment option */          557                 /* Environment option */
566                 unsigned int i;                   558                 unsigned int i;
567                 for (i = 0; envp_init[i]; i++)    559                 for (i = 0; envp_init[i]; i++) {
568                         if (i == MAX_INIT_ENVS    560                         if (i == MAX_INIT_ENVS) {
569                                 panic_later =     561                                 panic_later = "env";
570                                 panic_param =     562                                 panic_param = param;
571                         }                         563                         }
572                         if (!strncmp(param, en    564                         if (!strncmp(param, envp_init[i], len+1))
573                                 break;            565                                 break;
574                 }                                 566                 }
575                 envp_init[i] = param;             567                 envp_init[i] = param;
576         } else {                                  568         } else {
577                 /* Command line option */         569                 /* Command line option */
578                 unsigned int i;                   570                 unsigned int i;
579                 for (i = 0; argv_init[i]; i++)    571                 for (i = 0; argv_init[i]; i++) {
580                         if (i == MAX_INIT_ARGS    572                         if (i == MAX_INIT_ARGS) {
581                                 panic_later =     573                                 panic_later = "init";
582                                 panic_param =     574                                 panic_param = param;
583                         }                         575                         }
584                 }                                 576                 }
585                 argv_init[i] = param;             577                 argv_init[i] = param;
586         }                                         578         }
587         return 0;                                 579         return 0;
588 }                                                 580 }
589                                                   581 
590 static int __init init_setup(char *str)           582 static int __init init_setup(char *str)
591 {                                                 583 {
592         unsigned int i;                           584         unsigned int i;
593                                                   585 
594         execute_command = str;                    586         execute_command = str;
595         /*                                        587         /*
596          * In case LILO is going to boot us wi    588          * In case LILO is going to boot us with default command line,
597          * it prepends "auto" before the whole    589          * it prepends "auto" before the whole cmdline which makes
598          * the shell think it should execute a    590          * the shell think it should execute a script with such name.
599          * So we ignore all arguments entered     591          * So we ignore all arguments entered _before_ init=... [MJ]
600          */                                       592          */
601         for (i = 1; i < MAX_INIT_ARGS; i++)       593         for (i = 1; i < MAX_INIT_ARGS; i++)
602                 argv_init[i] = NULL;              594                 argv_init[i] = NULL;
603         return 1;                                 595         return 1;
604 }                                                 596 }
605 __setup("init=", init_setup);                     597 __setup("init=", init_setup);
606                                                   598 
607 static int __init rdinit_setup(char *str)         599 static int __init rdinit_setup(char *str)
608 {                                                 600 {
609         unsigned int i;                           601         unsigned int i;
610                                                   602 
611         ramdisk_execute_command = str;            603         ramdisk_execute_command = str;
612         /* See "auto" comment in init_setup */    604         /* See "auto" comment in init_setup */
613         for (i = 1; i < MAX_INIT_ARGS; i++)       605         for (i = 1; i < MAX_INIT_ARGS; i++)
614                 argv_init[i] = NULL;              606                 argv_init[i] = NULL;
615         return 1;                                 607         return 1;
616 }                                                 608 }
617 __setup("rdinit=", rdinit_setup);                 609 __setup("rdinit=", rdinit_setup);
618                                                   610 
619 #ifndef CONFIG_SMP                                611 #ifndef CONFIG_SMP
                                                   >> 612 static const unsigned int setup_max_cpus = NR_CPUS;
620 static inline void setup_nr_cpu_ids(void) { }     613 static inline void setup_nr_cpu_ids(void) { }
621 static inline void smp_prepare_cpus(unsigned i    614 static inline void smp_prepare_cpus(unsigned int maxcpus) { }
622 #endif                                            615 #endif
623                                                   616 
624 /*                                                617 /*
625  * We need to store the untouched command line    618  * We need to store the untouched command line for future reference.
626  * We also need to store the touched command l    619  * We also need to store the touched command line since the parameter
627  * parsing is performed in place, and we shoul    620  * parsing is performed in place, and we should allow a component to
628  * store reference of name/value for future re    621  * store reference of name/value for future reference.
629  */                                               622  */
630 static void __init setup_command_line(char *co    623 static void __init setup_command_line(char *command_line)
631 {                                                 624 {
632         size_t len, xlen = 0, ilen = 0;           625         size_t len, xlen = 0, ilen = 0;
633                                                   626 
634         if (extra_command_line)                   627         if (extra_command_line)
635                 xlen = strlen(extra_command_li    628                 xlen = strlen(extra_command_line);
636         if (extra_init_args) {                 !! 629         if (extra_init_args)
637                 extra_init_args = strim(extra_ << 
638                 ilen = strlen(extra_init_args)    630                 ilen = strlen(extra_init_args) + 4; /* for " -- " */
639         }                                      << 
640                                                   631 
641         len = xlen + strlen(boot_command_line) !! 632         len = xlen + strlen(boot_command_line) + 1;
642                                                   633 
643         saved_command_line = memblock_alloc(le !! 634         saved_command_line = memblock_alloc(len + ilen, SMP_CACHE_BYTES);
644         if (!saved_command_line)                  635         if (!saved_command_line)
645                 panic("%s: Failed to allocate  !! 636                 panic("%s: Failed to allocate %zu bytes\n", __func__, len + ilen);
646                                                   637 
647         len = xlen + strlen(command_line) + 1;    638         len = xlen + strlen(command_line) + 1;
648                                                   639 
649         static_command_line = memblock_alloc(l    640         static_command_line = memblock_alloc(len, SMP_CACHE_BYTES);
650         if (!static_command_line)                 641         if (!static_command_line)
651                 panic("%s: Failed to allocate     642                 panic("%s: Failed to allocate %zu bytes\n", __func__, len);
652                                                   643 
653         if (xlen) {                               644         if (xlen) {
654                 /*                                645                 /*
655                  * We have to put extra_comman    646                  * We have to put extra_command_line before boot command
656                  * lines because there could b    647                  * lines because there could be dashes (separator of init
657                  * command line) in the comman    648                  * command line) in the command lines.
658                  */                               649                  */
659                 strcpy(saved_command_line, ext    650                 strcpy(saved_command_line, extra_command_line);
660                 strcpy(static_command_line, ex    651                 strcpy(static_command_line, extra_command_line);
661         }                                         652         }
662         strcpy(saved_command_line + xlen, boot    653         strcpy(saved_command_line + xlen, boot_command_line);
663         strcpy(static_command_line + xlen, com    654         strcpy(static_command_line + xlen, command_line);
664                                                   655 
665         if (ilen) {                               656         if (ilen) {
666                 /*                                657                 /*
667                  * Append supplemental init bo    658                  * Append supplemental init boot args to saved_command_line
668                  * so that user can check what    659                  * so that user can check what command line options passed
669                  * to init.                       660                  * to init.
670                  * The order should always be     661                  * The order should always be
671                  * " -- "[bootconfig init-para    662                  * " -- "[bootconfig init-param][cmdline init-param]
672                  */                               663                  */
673                 if (initargs_offs) {              664                 if (initargs_offs) {
674                         len = xlen + initargs_    665                         len = xlen + initargs_offs;
675                         strcpy(saved_command_l    666                         strcpy(saved_command_line + len, extra_init_args);
676                         len += ilen - 4;          667                         len += ilen - 4;        /* strlen(extra_init_args) */
677                         strcpy(saved_command_l    668                         strcpy(saved_command_line + len,
678                                 boot_command_l    669                                 boot_command_line + initargs_offs - 1);
679                 } else {                          670                 } else {
680                         len = strlen(saved_com    671                         len = strlen(saved_command_line);
681                         strcpy(saved_command_l    672                         strcpy(saved_command_line + len, " -- ");
682                         len += 4;                 673                         len += 4;
683                         strcpy(saved_command_l    674                         strcpy(saved_command_line + len, extra_init_args);
684                 }                                 675                 }
685         }                                         676         }
686                                                   677 
687         saved_command_line_len = strlen(saved_    678         saved_command_line_len = strlen(saved_command_line);
688 }                                                 679 }
689                                                   680 
690 /*                                                681 /*
691  * We need to finalize in a non-__init functio    682  * We need to finalize in a non-__init function or else race conditions
692  * between the root thread and the init thread    683  * between the root thread and the init thread may cause start_kernel to
693  * be reaped by free_initmem before the root t    684  * be reaped by free_initmem before the root thread has proceeded to
694  * cpu_idle.                                      685  * cpu_idle.
695  *                                                686  *
696  * gcc-3.4 accidentally inlines this function,    687  * gcc-3.4 accidentally inlines this function, so use noinline.
697  */                                               688  */
698                                                   689 
699 static __initdata DECLARE_COMPLETION(kthreadd_    690 static __initdata DECLARE_COMPLETION(kthreadd_done);
700                                                   691 
701 static noinline void __ref __noreturn rest_ini !! 692 noinline void __ref __noreturn rest_init(void)
702 {                                                 693 {
703         struct task_struct *tsk;                  694         struct task_struct *tsk;
704         int pid;                                  695         int pid;
705                                                   696 
706         rcu_scheduler_starting();                 697         rcu_scheduler_starting();
707         /*                                        698         /*
708          * We need to spawn init first so that    699          * We need to spawn init first so that it obtains pid 1, however
709          * the init task will end up wanting t    700          * the init task will end up wanting to create kthreads, which, if
710          * we schedule it before we create kth    701          * we schedule it before we create kthreadd, will OOPS.
711          */                                       702          */
712         pid = user_mode_thread(kernel_init, NU    703         pid = user_mode_thread(kernel_init, NULL, CLONE_FS);
713         /*                                        704         /*
714          * Pin init on the boot CPU. Task migr    705          * Pin init on the boot CPU. Task migration is not properly working
715          * until sched_init_smp() has been run    706          * until sched_init_smp() has been run. It will set the allowed
716          * CPUs for init to the non isolated C    707          * CPUs for init to the non isolated CPUs.
717          */                                       708          */
718         rcu_read_lock();                          709         rcu_read_lock();
719         tsk = find_task_by_pid_ns(pid, &init_p    710         tsk = find_task_by_pid_ns(pid, &init_pid_ns);
720         tsk->flags |= PF_NO_SETAFFINITY;          711         tsk->flags |= PF_NO_SETAFFINITY;
721         set_cpus_allowed_ptr(tsk, cpumask_of(s    712         set_cpus_allowed_ptr(tsk, cpumask_of(smp_processor_id()));
722         rcu_read_unlock();                        713         rcu_read_unlock();
723                                                   714 
724         numa_default_policy();                    715         numa_default_policy();
725         pid = kernel_thread(kthreadd, NULL, NU    716         pid = kernel_thread(kthreadd, NULL, NULL, CLONE_FS | CLONE_FILES);
726         rcu_read_lock();                          717         rcu_read_lock();
727         kthreadd_task = find_task_by_pid_ns(pi    718         kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
728         rcu_read_unlock();                        719         rcu_read_unlock();
729                                                   720 
730         /*                                        721         /*
731          * Enable might_sleep() and smp_proces    722          * Enable might_sleep() and smp_processor_id() checks.
732          * They cannot be enabled earlier beca    723          * They cannot be enabled earlier because with CONFIG_PREEMPTION=y
733          * kernel_thread() would trigger might    724          * kernel_thread() would trigger might_sleep() splats. With
734          * CONFIG_PREEMPT_VOLUNTARY=y the init    725          * CONFIG_PREEMPT_VOLUNTARY=y the init task might have scheduled
735          * already, but it's stuck on the kthr    726          * already, but it's stuck on the kthreadd_done completion.
736          */                                       727          */
737         system_state = SYSTEM_SCHEDULING;         728         system_state = SYSTEM_SCHEDULING;
738                                                   729 
739         complete(&kthreadd_done);                 730         complete(&kthreadd_done);
740                                                   731 
741         /*                                        732         /*
742          * The boot idle thread must execute s    733          * The boot idle thread must execute schedule()
743          * at least once to get things moving:    734          * at least once to get things moving:
744          */                                       735          */
745         schedule_preempt_disabled();              736         schedule_preempt_disabled();
746         /* Call into cpu_idle with preempt dis    737         /* Call into cpu_idle with preempt disabled */
747         cpu_startup_entry(CPUHP_ONLINE);          738         cpu_startup_entry(CPUHP_ONLINE);
748 }                                                 739 }
749                                                   740 
750 /* Check for early params. */                     741 /* Check for early params. */
751 static int __init do_early_param(char *param,     742 static int __init do_early_param(char *param, char *val,
752                                  const char *u    743                                  const char *unused, void *arg)
753 {                                                 744 {
754         const struct obs_kernel_param *p;         745         const struct obs_kernel_param *p;
755                                                   746 
756         for (p = __setup_start; p < __setup_en    747         for (p = __setup_start; p < __setup_end; p++) {
757                 if ((p->early && parameq(param    748                 if ((p->early && parameq(param, p->str)) ||
758                     (strcmp(param, "console")     749                     (strcmp(param, "console") == 0 &&
759                      strcmp(p->str, "earlycon"    750                      strcmp(p->str, "earlycon") == 0)
760                 ) {                               751                 ) {
761                         if (p->setup_func(val)    752                         if (p->setup_func(val) != 0)
762                                 pr_warn("Malfo    753                                 pr_warn("Malformed early option '%s'\n", param);
763                 }                                 754                 }
764         }                                         755         }
765         /* We accept everything at this stage.    756         /* We accept everything at this stage. */
766         return 0;                                 757         return 0;
767 }                                                 758 }
768                                                   759 
769 void __init parse_early_options(char *cmdline)    760 void __init parse_early_options(char *cmdline)
770 {                                                 761 {
771         parse_args("early options", cmdline, N    762         parse_args("early options", cmdline, NULL, 0, 0, 0, NULL,
772                    do_early_param);               763                    do_early_param);
773 }                                                 764 }
774                                                   765 
775 /* Arch code calls this early on, or if not, j    766 /* Arch code calls this early on, or if not, just before other parsing. */
776 void __init parse_early_param(void)               767 void __init parse_early_param(void)
777 {                                                 768 {
778         static int done __initdata;               769         static int done __initdata;
779         static char tmp_cmdline[COMMAND_LINE_S    770         static char tmp_cmdline[COMMAND_LINE_SIZE] __initdata;
780                                                   771 
781         if (done)                                 772         if (done)
782                 return;                           773                 return;
783                                                   774 
784         /* All fall through to do_early_param.    775         /* All fall through to do_early_param. */
785         strscpy(tmp_cmdline, boot_command_line    776         strscpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
786         parse_early_options(tmp_cmdline);         777         parse_early_options(tmp_cmdline);
787         done = 1;                                 778         done = 1;
788 }                                                 779 }
789                                                   780 
790 void __init __weak arch_post_acpi_subsys_init(    781 void __init __weak arch_post_acpi_subsys_init(void) { }
791                                                   782 
792 void __init __weak smp_setup_processor_id(void    783 void __init __weak smp_setup_processor_id(void)
793 {                                                 784 {
794 }                                                 785 }
795                                                   786 
796 void __init __weak smp_prepare_boot_cpu(void)  << 
797 {                                              << 
798 }                                              << 
799                                                << 
800 # if THREAD_SIZE >= PAGE_SIZE                     787 # if THREAD_SIZE >= PAGE_SIZE
801 void __init __weak thread_stack_cache_init(voi    788 void __init __weak thread_stack_cache_init(void)
802 {                                                 789 {
803 }                                                 790 }
804 #endif                                            791 #endif
805                                                   792 
806 void __init __weak poking_init(void) { }          793 void __init __weak poking_init(void) { }
807                                                   794 
808 void __init __weak pgtable_cache_init(void) {     795 void __init __weak pgtable_cache_init(void) { }
809                                                   796 
810 void __init __weak trap_init(void) { }            797 void __init __weak trap_init(void) { }
811                                                   798 
812 bool initcall_debug;                              799 bool initcall_debug;
813 core_param(initcall_debug, initcall_debug, boo    800 core_param(initcall_debug, initcall_debug, bool, 0644);
814                                                   801 
815 #ifdef TRACEPOINTS_ENABLED                        802 #ifdef TRACEPOINTS_ENABLED
816 static void __init initcall_debug_enable(void)    803 static void __init initcall_debug_enable(void);
817 #else                                             804 #else
818 static inline void initcall_debug_enable(void)    805 static inline void initcall_debug_enable(void)
819 {                                                 806 {
820 }                                                 807 }
821 #endif                                            808 #endif
822                                                   809 
823 #ifdef CONFIG_RANDOMIZE_KSTACK_OFFSET             810 #ifdef CONFIG_RANDOMIZE_KSTACK_OFFSET
824 DEFINE_STATIC_KEY_MAYBE_RO(CONFIG_RANDOMIZE_KS    811 DEFINE_STATIC_KEY_MAYBE_RO(CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT,
825                            randomize_kstack_of    812                            randomize_kstack_offset);
826 DEFINE_PER_CPU(u32, kstack_offset);               813 DEFINE_PER_CPU(u32, kstack_offset);
827                                                   814 
828 static int __init early_randomize_kstack_offse    815 static int __init early_randomize_kstack_offset(char *buf)
829 {                                                 816 {
830         int ret;                                  817         int ret;
831         bool bool_result;                         818         bool bool_result;
832                                                   819 
833         ret = kstrtobool(buf, &bool_result);      820         ret = kstrtobool(buf, &bool_result);
834         if (ret)                                  821         if (ret)
835                 return ret;                       822                 return ret;
836                                                   823 
837         if (bool_result)                          824         if (bool_result)
838                 static_branch_enable(&randomiz    825                 static_branch_enable(&randomize_kstack_offset);
839         else                                      826         else
840                 static_branch_disable(&randomi    827                 static_branch_disable(&randomize_kstack_offset);
841         return 0;                                 828         return 0;
842 }                                                 829 }
843 early_param("randomize_kstack_offset", early_r    830 early_param("randomize_kstack_offset", early_randomize_kstack_offset);
844 #endif                                            831 #endif
845                                                   832 
                                                   >> 833 void __init __weak __noreturn arch_call_rest_init(void)
                                                   >> 834 {
                                                   >> 835         rest_init();
                                                   >> 836 }
                                                   >> 837 
846 static void __init print_unknown_bootoptions(v    838 static void __init print_unknown_bootoptions(void)
847 {                                                 839 {
848         char *unknown_options;                    840         char *unknown_options;
849         char *end;                                841         char *end;
850         const char *const *p;                     842         const char *const *p;
851         size_t len;                               843         size_t len;
852                                                   844 
853         if (panic_later || (!argv_init[1] && !    845         if (panic_later || (!argv_init[1] && !envp_init[2]))
854                 return;                           846                 return;
855                                                   847 
856         /*                                        848         /*
857          * Determine how many options we have     849          * Determine how many options we have to print out, plus a space
858          * before each                            850          * before each
859          */                                       851          */
860         len = 1; /* null terminator */            852         len = 1; /* null terminator */
861         for (p = &argv_init[1]; *p; p++) {        853         for (p = &argv_init[1]; *p; p++) {
862                 len++;                            854                 len++;
863                 len += strlen(*p);                855                 len += strlen(*p);
864         }                                         856         }
865         for (p = &envp_init[2]; *p; p++) {        857         for (p = &envp_init[2]; *p; p++) {
866                 len++;                            858                 len++;
867                 len += strlen(*p);                859                 len += strlen(*p);
868         }                                         860         }
869                                                   861 
870         unknown_options = memblock_alloc(len,     862         unknown_options = memblock_alloc(len, SMP_CACHE_BYTES);
871         if (!unknown_options) {                   863         if (!unknown_options) {
872                 pr_err("%s: Failed to allocate    864                 pr_err("%s: Failed to allocate %zu bytes\n",
873                         __func__, len);           865                         __func__, len);
874                 return;                           866                 return;
875         }                                         867         }
876         end = unknown_options;                    868         end = unknown_options;
877                                                   869 
878         for (p = &argv_init[1]; *p; p++)          870         for (p = &argv_init[1]; *p; p++)
879                 end += sprintf(end, " %s", *p)    871                 end += sprintf(end, " %s", *p);
880         for (p = &envp_init[2]; *p; p++)          872         for (p = &envp_init[2]; *p; p++)
881                 end += sprintf(end, " %s", *p)    873                 end += sprintf(end, " %s", *p);
882                                                   874 
883         /* Start at unknown_options[1] to skip    875         /* Start at unknown_options[1] to skip the initial space */
884         pr_notice("Unknown kernel command line    876         pr_notice("Unknown kernel command line parameters \"%s\", will be passed to user space.\n",
885                 &unknown_options[1]);             877                 &unknown_options[1]);
886         memblock_free(unknown_options, len);      878         memblock_free(unknown_options, len);
887 }                                                 879 }
888                                                   880 
889 static void __init early_numa_node_init(void)  << 
890 {                                              << 
891 #ifdef CONFIG_USE_PERCPU_NUMA_NODE_ID          << 
892 #ifndef cpu_to_node                            << 
893         int cpu;                               << 
894                                                << 
895         /* The early_cpu_to_node() should be r << 
896         for_each_possible_cpu(cpu)             << 
897                 set_cpu_numa_node(cpu, early_c << 
898 #endif                                         << 
899 #endif                                         << 
900 }                                              << 
901                                                << 
902 asmlinkage __visible __init __no_sanitize_addr    881 asmlinkage __visible __init __no_sanitize_address __noreturn __no_stack_protector
903 void start_kernel(void)                           882 void start_kernel(void)
904 {                                                 883 {
905         char *command_line;                       884         char *command_line;
906         char *after_dashes;                       885         char *after_dashes;
907                                                   886 
908         set_task_stack_end_magic(&init_task);     887         set_task_stack_end_magic(&init_task);
909         smp_setup_processor_id();                 888         smp_setup_processor_id();
910         debug_objects_early_init();               889         debug_objects_early_init();
911         init_vmlinux_build_id();                  890         init_vmlinux_build_id();
912                                                   891 
913         cgroup_init_early();                      892         cgroup_init_early();
914                                                   893 
915         local_irq_disable();                      894         local_irq_disable();
916         early_boot_irqs_disabled = true;          895         early_boot_irqs_disabled = true;
917                                                   896 
918         /*                                        897         /*
919          * Interrupts are still disabled. Do n    898          * Interrupts are still disabled. Do necessary setups, then
920          * enable them.                           899          * enable them.
921          */                                       900          */
922         boot_cpu_init();                          901         boot_cpu_init();
923         page_address_init();                      902         page_address_init();
924         pr_notice("%s", linux_banner);            903         pr_notice("%s", linux_banner);
925         setup_arch(&command_line);             << 
926         /* Static keys and static calls are ne << 
927         jump_label_init();                     << 
928         static_call_init();                    << 
929         early_security_init();                    904         early_security_init();
                                                   >> 905         setup_arch(&command_line);
930         setup_boot_config();                      906         setup_boot_config();
931         setup_command_line(command_line);         907         setup_command_line(command_line);
932         setup_nr_cpu_ids();                       908         setup_nr_cpu_ids();
933         setup_per_cpu_areas();                    909         setup_per_cpu_areas();
934         smp_prepare_boot_cpu(); /* arch-specif    910         smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
935         early_numa_node_init();                << 
936         boot_cpu_hotplug_init();                  911         boot_cpu_hotplug_init();
937                                                   912 
938         pr_notice("Kernel command line: %s\n",    913         pr_notice("Kernel command line: %s\n", saved_command_line);
939         /* parameters may set static keys */      914         /* parameters may set static keys */
                                                   >> 915         jump_label_init();
940         parse_early_param();                      916         parse_early_param();
941         after_dashes = parse_args("Booting ker    917         after_dashes = parse_args("Booting kernel",
942                                   static_comma    918                                   static_command_line, __start___param,
943                                   __stop___par    919                                   __stop___param - __start___param,
944                                   -1, -1, NULL    920                                   -1, -1, NULL, &unknown_bootoption);
945         print_unknown_bootoptions();              921         print_unknown_bootoptions();
946         if (!IS_ERR_OR_NULL(after_dashes))        922         if (!IS_ERR_OR_NULL(after_dashes))
947                 parse_args("Setting init args"    923                 parse_args("Setting init args", after_dashes, NULL, 0, -1, -1,
948                            NULL, set_init_arg)    924                            NULL, set_init_arg);
949         if (extra_init_args)                      925         if (extra_init_args)
950                 parse_args("Setting extra init    926                 parse_args("Setting extra init args", extra_init_args,
951                            NULL, 0, -1, -1, NU    927                            NULL, 0, -1, -1, NULL, set_init_arg);
952                                                   928 
953         /* Architectural and non-timekeeping r    929         /* Architectural and non-timekeeping rng init, before allocator init */
954         random_init_early(command_line);          930         random_init_early(command_line);
955                                                   931 
956         /*                                        932         /*
957          * These use large bootmem allocations    933          * These use large bootmem allocations and must precede
958          * initalization of page allocator        934          * initalization of page allocator
959          */                                       935          */
960         setup_log_buf(0);                         936         setup_log_buf(0);
961         vfs_caches_init_early();                  937         vfs_caches_init_early();
962         sort_main_extable();                      938         sort_main_extable();
963         trap_init();                              939         trap_init();
964         mm_core_init();                           940         mm_core_init();
965         poking_init();                            941         poking_init();
966         ftrace_init();                            942         ftrace_init();
967                                                   943 
968         /* trace_printk can be enabled here */    944         /* trace_printk can be enabled here */
969         early_trace_init();                       945         early_trace_init();
970                                                   946 
971         /*                                        947         /*
972          * Set up the scheduler prior starting    948          * Set up the scheduler prior starting any interrupts (such as the
973          * timer interrupt). Full topology set    949          * timer interrupt). Full topology setup happens at smp_init()
974          * time - but meanwhile we still have     950          * time - but meanwhile we still have a functioning scheduler.
975          */                                       951          */
976         sched_init();                             952         sched_init();
977                                                   953 
978         if (WARN(!irqs_disabled(),                954         if (WARN(!irqs_disabled(),
979                  "Interrupts were enabled *ver    955                  "Interrupts were enabled *very* early, fixing it\n"))
980                 local_irq_disable();              956                 local_irq_disable();
981         radix_tree_init();                        957         radix_tree_init();
982         maple_tree_init();                        958         maple_tree_init();
983                                                   959 
984         /*                                        960         /*
985          * Set up housekeeping before setting     961          * Set up housekeeping before setting up workqueues to allow the unbound
986          * workqueue to take non-housekeeping     962          * workqueue to take non-housekeeping into account.
987          */                                       963          */
988         housekeeping_init();                      964         housekeeping_init();
989                                                   965 
990         /*                                        966         /*
991          * Allow workqueue creation and work i    967          * Allow workqueue creation and work item queueing/cancelling
992          * early.  Work item execution depends    968          * early.  Work item execution depends on kthreads and starts after
993          * workqueue_init().                      969          * workqueue_init().
994          */                                       970          */
995         workqueue_init_early();                   971         workqueue_init_early();
996                                                   972 
997         rcu_init();                               973         rcu_init();
998                                                   974 
999         /* Trace events are available after th    975         /* Trace events are available after this */
1000         trace_init();                            976         trace_init();
1001                                                  977 
1002         if (initcall_debug)                      978         if (initcall_debug)
1003                 initcall_debug_enable();         979                 initcall_debug_enable();
1004                                                  980 
1005         context_tracking_init();                 981         context_tracking_init();
1006         /* init some links before init_ISA_ir    982         /* init some links before init_ISA_irqs() */
1007         early_irq_init();                        983         early_irq_init();
1008         init_IRQ();                              984         init_IRQ();
1009         tick_init();                             985         tick_init();
1010         rcu_init_nohz();                         986         rcu_init_nohz();
1011         init_timers();                           987         init_timers();
1012         srcu_init();                             988         srcu_init();
1013         hrtimers_init();                         989         hrtimers_init();
1014         softirq_init();                          990         softirq_init();
1015         timekeeping_init();                      991         timekeeping_init();
1016         time_init();                             992         time_init();
1017                                                  993 
1018         /* This must be after timekeeping is     994         /* This must be after timekeeping is initialized */
1019         random_init();                           995         random_init();
1020                                                  996 
1021         /* These make use of the fully initia    997         /* These make use of the fully initialized rng */
1022         kfence_init();                           998         kfence_init();
1023         boot_init_stack_canary();                999         boot_init_stack_canary();
1024                                                  1000 
1025         perf_event_init();                       1001         perf_event_init();
1026         profile_init();                          1002         profile_init();
1027         call_function_init();                    1003         call_function_init();
1028         WARN(!irqs_disabled(), "Interrupts we    1004         WARN(!irqs_disabled(), "Interrupts were enabled early\n");
1029                                                  1005 
1030         early_boot_irqs_disabled = false;        1006         early_boot_irqs_disabled = false;
1031         local_irq_enable();                      1007         local_irq_enable();
1032                                                  1008 
1033         kmem_cache_init_late();                  1009         kmem_cache_init_late();
1034                                                  1010 
1035         /*                                       1011         /*
1036          * HACK ALERT! This is early. We're e    1012          * HACK ALERT! This is early. We're enabling the console before
1037          * we've done PCI setups etc, and con    1013          * we've done PCI setups etc, and console_init() must be aware of
1038          * this. But we do want output early,    1014          * this. But we do want output early, in case something goes wrong.
1039          */                                      1015          */
1040         console_init();                          1016         console_init();
1041         if (panic_later)                         1017         if (panic_later)
1042                 panic("Too many boot %s vars     1018                 panic("Too many boot %s vars at `%s'", panic_later,
1043                       panic_param);              1019                       panic_param);
1044                                                  1020 
1045         lockdep_init();                          1021         lockdep_init();
1046                                                  1022 
1047         /*                                       1023         /*
1048          * Need to run this when irqs are ena    1024          * Need to run this when irqs are enabled, because it wants
1049          * to self-test [hard/soft]-irqs on/o    1025          * to self-test [hard/soft]-irqs on/off lock inversion bugs
1050          * too:                                  1026          * too:
1051          */                                      1027          */
1052         locking_selftest();                      1028         locking_selftest();
1053                                                  1029 
1054 #ifdef CONFIG_BLK_DEV_INITRD                     1030 #ifdef CONFIG_BLK_DEV_INITRD
1055         if (initrd_start && !initrd_below_sta    1031         if (initrd_start && !initrd_below_start_ok &&
1056             page_to_pfn(virt_to_page((void *)    1032             page_to_pfn(virt_to_page((void *)initrd_start)) < min_low_pfn) {
1057                 pr_crit("initrd overwritten (    1033                 pr_crit("initrd overwritten (0x%08lx < 0x%08lx) - disabling it.\n",
1058                     page_to_pfn(virt_to_page(    1034                     page_to_pfn(virt_to_page((void *)initrd_start)),
1059                     min_low_pfn);                1035                     min_low_pfn);
1060                 initrd_start = 0;                1036                 initrd_start = 0;
1061         }                                        1037         }
1062 #endif                                           1038 #endif
1063         setup_per_cpu_pageset();                 1039         setup_per_cpu_pageset();
1064         numa_policy_init();                      1040         numa_policy_init();
1065         acpi_early_init();                       1041         acpi_early_init();
1066         if (late_time_init)                      1042         if (late_time_init)
1067                 late_time_init();                1043                 late_time_init();
1068         sched_clock_init();                      1044         sched_clock_init();
1069         calibrate_delay();                       1045         calibrate_delay();
1070                                                  1046 
1071         arch_cpu_finalize_init();                1047         arch_cpu_finalize_init();
1072                                                  1048 
1073         pid_idr_init();                          1049         pid_idr_init();
1074         anon_vma_init();                         1050         anon_vma_init();
1075 #ifdef CONFIG_X86                                1051 #ifdef CONFIG_X86
1076         if (efi_enabled(EFI_RUNTIME_SERVICES)    1052         if (efi_enabled(EFI_RUNTIME_SERVICES))
1077                 efi_enter_virtual_mode();        1053                 efi_enter_virtual_mode();
1078 #endif                                           1054 #endif
1079         thread_stack_cache_init();               1055         thread_stack_cache_init();
1080         cred_init();                             1056         cred_init();
1081         fork_init();                             1057         fork_init();
1082         proc_caches_init();                      1058         proc_caches_init();
1083         uts_ns_init();                           1059         uts_ns_init();
1084         key_init();                              1060         key_init();
1085         security_init();                         1061         security_init();
1086         dbg_late_init();                         1062         dbg_late_init();
1087         net_ns_init();                           1063         net_ns_init();
1088         vfs_caches_init();                       1064         vfs_caches_init();
1089         pagecache_init();                        1065         pagecache_init();
1090         signals_init();                          1066         signals_init();
1091         seq_file_init();                         1067         seq_file_init();
1092         proc_root_init();                        1068         proc_root_init();
1093         nsfs_init();                             1069         nsfs_init();
1094         pidfs_init();                         << 
1095         cpuset_init();                           1070         cpuset_init();
1096         cgroup_init();                           1071         cgroup_init();
1097         taskstats_init_early();                  1072         taskstats_init_early();
1098         delayacct_init();                        1073         delayacct_init();
1099                                                  1074 
1100         acpi_subsystem_init();                   1075         acpi_subsystem_init();
1101         arch_post_acpi_subsys_init();            1076         arch_post_acpi_subsys_init();
1102         kcsan_init();                            1077         kcsan_init();
1103                                                  1078 
1104         /* Do the rest non-__init'ed, we're n    1079         /* Do the rest non-__init'ed, we're now alive */
1105         rest_init();                          !! 1080         arch_call_rest_init();
1106                                                  1081 
1107         /*                                       1082         /*
1108          * Avoid stack canaries in callers of    1083          * Avoid stack canaries in callers of boot_init_stack_canary for gcc-10
1109          * and older.                            1084          * and older.
1110          */                                      1085          */
1111 #if !__has_attribute(__no_stack_protector__)     1086 #if !__has_attribute(__no_stack_protector__)
1112         prevent_tail_call_optimization();        1087         prevent_tail_call_optimization();
1113 #endif                                           1088 #endif
1114 }                                                1089 }
1115                                                  1090 
1116 /* Call all constructor functions linked into    1091 /* Call all constructor functions linked into the kernel. */
1117 static void __init do_ctors(void)                1092 static void __init do_ctors(void)
1118 {                                                1093 {
1119 /*                                               1094 /*
1120  * For UML, the constructors have already bee    1095  * For UML, the constructors have already been called by the
1121  * normal setup code as it's just a normal EL    1096  * normal setup code as it's just a normal ELF binary, so we
1122  * cannot do it again - but we do need CONFIG    1097  * cannot do it again - but we do need CONFIG_CONSTRUCTORS
1123  * even on UML for modules.                      1098  * even on UML for modules.
1124  */                                              1099  */
1125 #if defined(CONFIG_CONSTRUCTORS) && !defined(    1100 #if defined(CONFIG_CONSTRUCTORS) && !defined(CONFIG_UML)
1126         ctor_fn_t *fn = (ctor_fn_t *) __ctors    1101         ctor_fn_t *fn = (ctor_fn_t *) __ctors_start;
1127                                                  1102 
1128         for (; fn < (ctor_fn_t *) __ctors_end    1103         for (; fn < (ctor_fn_t *) __ctors_end; fn++)
1129                 (*fn)();                         1104                 (*fn)();
1130 #endif                                           1105 #endif
1131 }                                                1106 }
1132                                                  1107 
1133 #ifdef CONFIG_KALLSYMS                           1108 #ifdef CONFIG_KALLSYMS
1134 struct blacklist_entry {                         1109 struct blacklist_entry {
1135         struct list_head next;                   1110         struct list_head next;
1136         char *buf;                               1111         char *buf;
1137 };                                               1112 };
1138                                                  1113 
1139 static __initdata_or_module LIST_HEAD(blackli    1114 static __initdata_or_module LIST_HEAD(blacklisted_initcalls);
1140                                                  1115 
1141 static int __init initcall_blacklist(char *st    1116 static int __init initcall_blacklist(char *str)
1142 {                                                1117 {
1143         char *str_entry;                         1118         char *str_entry;
1144         struct blacklist_entry *entry;           1119         struct blacklist_entry *entry;
1145                                                  1120 
1146         /* str argument is a comma-separated     1121         /* str argument is a comma-separated list of functions */
1147         do {                                     1122         do {
1148                 str_entry = strsep(&str, ",")    1123                 str_entry = strsep(&str, ",");
1149                 if (str_entry) {                 1124                 if (str_entry) {
1150                         pr_debug("blacklistin    1125                         pr_debug("blacklisting initcall %s\n", str_entry);
1151                         entry = memblock_allo    1126                         entry = memblock_alloc(sizeof(*entry),
1152                                                  1127                                                SMP_CACHE_BYTES);
1153                         if (!entry)              1128                         if (!entry)
1154                                 panic("%s: Fa    1129                                 panic("%s: Failed to allocate %zu bytes\n",
1155                                       __func_    1130                                       __func__, sizeof(*entry));
1156                         entry->buf = memblock    1131                         entry->buf = memblock_alloc(strlen(str_entry) + 1,
1157                                                  1132                                                     SMP_CACHE_BYTES);
1158                         if (!entry->buf)         1133                         if (!entry->buf)
1159                                 panic("%s: Fa    1134                                 panic("%s: Failed to allocate %zu bytes\n",
1160                                       __func_    1135                                       __func__, strlen(str_entry) + 1);
1161                         strcpy(entry->buf, st    1136                         strcpy(entry->buf, str_entry);
1162                         list_add(&entry->next    1137                         list_add(&entry->next, &blacklisted_initcalls);
1163                 }                                1138                 }
1164         } while (str_entry);                     1139         } while (str_entry);
1165                                                  1140 
1166         return 1;                                1141         return 1;
1167 }                                                1142 }
1168                                                  1143 
1169 static bool __init_or_module initcall_blackli    1144 static bool __init_or_module initcall_blacklisted(initcall_t fn)
1170 {                                                1145 {
1171         struct blacklist_entry *entry;           1146         struct blacklist_entry *entry;
1172         char fn_name[KSYM_SYMBOL_LEN];           1147         char fn_name[KSYM_SYMBOL_LEN];
1173         unsigned long addr;                      1148         unsigned long addr;
1174                                                  1149 
1175         if (list_empty(&blacklisted_initcalls    1150         if (list_empty(&blacklisted_initcalls))
1176                 return false;                    1151                 return false;
1177                                                  1152 
1178         addr = (unsigned long) dereference_fu    1153         addr = (unsigned long) dereference_function_descriptor(fn);
1179         sprint_symbol_no_offset(fn_name, addr    1154         sprint_symbol_no_offset(fn_name, addr);
1180                                                  1155 
1181         /*                                       1156         /*
1182          * fn will be "function_name [module_    1157          * fn will be "function_name [module_name]" where [module_name] is not
1183          * displayed for built-in init functi    1158          * displayed for built-in init functions.  Strip off the [module_name].
1184          */                                      1159          */
1185         strreplace(fn_name, ' ', '\0');          1160         strreplace(fn_name, ' ', '\0');
1186                                                  1161 
1187         list_for_each_entry(entry, &blacklist    1162         list_for_each_entry(entry, &blacklisted_initcalls, next) {
1188                 if (!strcmp(fn_name, entry->b    1163                 if (!strcmp(fn_name, entry->buf)) {
1189                         pr_debug("initcall %s    1164                         pr_debug("initcall %s blacklisted\n", fn_name);
1190                         return true;             1165                         return true;
1191                 }                                1166                 }
1192         }                                        1167         }
1193                                                  1168 
1194         return false;                            1169         return false;
1195 }                                                1170 }
1196 #else                                            1171 #else
1197 static int __init initcall_blacklist(char *st    1172 static int __init initcall_blacklist(char *str)
1198 {                                                1173 {
1199         pr_warn("initcall_blacklist requires     1174         pr_warn("initcall_blacklist requires CONFIG_KALLSYMS\n");
1200         return 0;                                1175         return 0;
1201 }                                                1176 }
1202                                                  1177 
1203 static bool __init_or_module initcall_blackli    1178 static bool __init_or_module initcall_blacklisted(initcall_t fn)
1204 {                                                1179 {
1205         return false;                            1180         return false;
1206 }                                                1181 }
1207 #endif                                           1182 #endif
1208 __setup("initcall_blacklist=", initcall_black    1183 __setup("initcall_blacklist=", initcall_blacklist);
1209                                                  1184 
1210 static __init_or_module void                     1185 static __init_or_module void
1211 trace_initcall_start_cb(void *data, initcall_    1186 trace_initcall_start_cb(void *data, initcall_t fn)
1212 {                                                1187 {
1213         ktime_t *calltime = data;                1188         ktime_t *calltime = data;
1214                                                  1189 
1215         printk(KERN_DEBUG "calling  %pS @ %i\    1190         printk(KERN_DEBUG "calling  %pS @ %i\n", fn, task_pid_nr(current));
1216         *calltime = ktime_get();                 1191         *calltime = ktime_get();
1217 }                                                1192 }
1218                                                  1193 
1219 static __init_or_module void                     1194 static __init_or_module void
1220 trace_initcall_finish_cb(void *data, initcall    1195 trace_initcall_finish_cb(void *data, initcall_t fn, int ret)
1221 {                                                1196 {
1222         ktime_t rettime, *calltime = data;       1197         ktime_t rettime, *calltime = data;
1223                                                  1198 
1224         rettime = ktime_get();                   1199         rettime = ktime_get();
1225         printk(KERN_DEBUG "initcall %pS retur    1200         printk(KERN_DEBUG "initcall %pS returned %d after %lld usecs\n",
1226                  fn, ret, (unsigned long long    1201                  fn, ret, (unsigned long long)ktime_us_delta(rettime, *calltime));
1227 }                                                1202 }
1228                                                  1203 
1229 static ktime_t initcall_calltime;                1204 static ktime_t initcall_calltime;
1230                                                  1205 
1231 #ifdef TRACEPOINTS_ENABLED                       1206 #ifdef TRACEPOINTS_ENABLED
1232 static void __init initcall_debug_enable(void    1207 static void __init initcall_debug_enable(void)
1233 {                                                1208 {
1234         int ret;                                 1209         int ret;
1235                                                  1210 
1236         ret = register_trace_initcall_start(t    1211         ret = register_trace_initcall_start(trace_initcall_start_cb,
1237                                             &    1212                                             &initcall_calltime);
1238         ret |= register_trace_initcall_finish    1213         ret |= register_trace_initcall_finish(trace_initcall_finish_cb,
1239                                                  1214                                               &initcall_calltime);
1240         WARN(ret, "Failed to register initcal    1215         WARN(ret, "Failed to register initcall tracepoints\n");
1241 }                                                1216 }
1242 # define do_trace_initcall_start        trace    1217 # define do_trace_initcall_start        trace_initcall_start
1243 # define do_trace_initcall_finish       trace    1218 # define do_trace_initcall_finish       trace_initcall_finish
1244 #else                                            1219 #else
1245 static inline void do_trace_initcall_start(in    1220 static inline void do_trace_initcall_start(initcall_t fn)
1246 {                                                1221 {
1247         if (!initcall_debug)                     1222         if (!initcall_debug)
1248                 return;                          1223                 return;
1249         trace_initcall_start_cb(&initcall_cal    1224         trace_initcall_start_cb(&initcall_calltime, fn);
1250 }                                                1225 }
1251 static inline void do_trace_initcall_finish(i    1226 static inline void do_trace_initcall_finish(initcall_t fn, int ret)
1252 {                                                1227 {
1253         if (!initcall_debug)                     1228         if (!initcall_debug)
1254                 return;                          1229                 return;
1255         trace_initcall_finish_cb(&initcall_ca    1230         trace_initcall_finish_cb(&initcall_calltime, fn, ret);
1256 }                                                1231 }
1257 #endif /* !TRACEPOINTS_ENABLED */                1232 #endif /* !TRACEPOINTS_ENABLED */
1258                                                  1233 
1259 int __init_or_module do_one_initcall(initcall    1234 int __init_or_module do_one_initcall(initcall_t fn)
1260 {                                                1235 {
1261         int count = preempt_count();             1236         int count = preempt_count();
1262         char msgbuf[64];                         1237         char msgbuf[64];
1263         int ret;                                 1238         int ret;
1264                                                  1239 
1265         if (initcall_blacklisted(fn))            1240         if (initcall_blacklisted(fn))
1266                 return -EPERM;                   1241                 return -EPERM;
1267                                                  1242 
1268         do_trace_initcall_start(fn);             1243         do_trace_initcall_start(fn);
1269         ret = fn();                              1244         ret = fn();
1270         do_trace_initcall_finish(fn, ret);       1245         do_trace_initcall_finish(fn, ret);
1271                                                  1246 
1272         msgbuf[0] = 0;                           1247         msgbuf[0] = 0;
1273                                                  1248 
1274         if (preempt_count() != count) {          1249         if (preempt_count() != count) {
1275                 sprintf(msgbuf, "preemption i    1250                 sprintf(msgbuf, "preemption imbalance ");
1276                 preempt_count_set(count);        1251                 preempt_count_set(count);
1277         }                                        1252         }
1278         if (irqs_disabled()) {                   1253         if (irqs_disabled()) {
1279                 strlcat(msgbuf, "disabled int    1254                 strlcat(msgbuf, "disabled interrupts ", sizeof(msgbuf));
1280                 local_irq_enable();              1255                 local_irq_enable();
1281         }                                        1256         }
1282         WARN(msgbuf[0], "initcall %pS returne    1257         WARN(msgbuf[0], "initcall %pS returned with %s\n", fn, msgbuf);
1283                                                  1258 
1284         add_latent_entropy();                    1259         add_latent_entropy();
1285         return ret;                              1260         return ret;
1286 }                                                1261 }
1287                                                  1262 
1288                                                  1263 
1289 static initcall_entry_t *initcall_levels[] __    1264 static initcall_entry_t *initcall_levels[] __initdata = {
1290         __initcall0_start,                       1265         __initcall0_start,
1291         __initcall1_start,                       1266         __initcall1_start,
1292         __initcall2_start,                       1267         __initcall2_start,
1293         __initcall3_start,                       1268         __initcall3_start,
1294         __initcall4_start,                       1269         __initcall4_start,
1295         __initcall5_start,                       1270         __initcall5_start,
1296         __initcall6_start,                       1271         __initcall6_start,
1297         __initcall7_start,                       1272         __initcall7_start,
1298         __initcall_end,                          1273         __initcall_end,
1299 };                                               1274 };
1300                                                  1275 
1301 /* Keep these in sync with initcalls in inclu    1276 /* Keep these in sync with initcalls in include/linux/init.h */
1302 static const char *initcall_level_names[] __i    1277 static const char *initcall_level_names[] __initdata = {
1303         "pure",                                  1278         "pure",
1304         "core",                                  1279         "core",
1305         "postcore",                              1280         "postcore",
1306         "arch",                                  1281         "arch",
1307         "subsys",                                1282         "subsys",
1308         "fs",                                    1283         "fs",
1309         "device",                                1284         "device",
1310         "late",                                  1285         "late",
1311 };                                               1286 };
1312                                                  1287 
1313 static int __init ignore_unknown_bootoption(c    1288 static int __init ignore_unknown_bootoption(char *param, char *val,
1314                                const char *un    1289                                const char *unused, void *arg)
1315 {                                                1290 {
1316         return 0;                                1291         return 0;
1317 }                                                1292 }
1318                                                  1293 
1319 static void __init do_initcall_level(int leve    1294 static void __init do_initcall_level(int level, char *command_line)
1320 {                                                1295 {
1321         initcall_entry_t *fn;                    1296         initcall_entry_t *fn;
1322                                                  1297 
1323         parse_args(initcall_level_names[level    1298         parse_args(initcall_level_names[level],
1324                    command_line, __start___pa    1299                    command_line, __start___param,
1325                    __stop___param - __start__    1300                    __stop___param - __start___param,
1326                    level, level,                 1301                    level, level,
1327                    NULL, ignore_unknown_booto    1302                    NULL, ignore_unknown_bootoption);
1328                                                  1303 
1329         trace_initcall_level(initcall_level_n    1304         trace_initcall_level(initcall_level_names[level]);
1330         for (fn = initcall_levels[level]; fn     1305         for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++)
1331                 do_one_initcall(initcall_from    1306                 do_one_initcall(initcall_from_entry(fn));
1332 }                                                1307 }
1333                                                  1308 
1334 static void __init do_initcalls(void)            1309 static void __init do_initcalls(void)
1335 {                                                1310 {
1336         int level;                               1311         int level;
1337         size_t len = saved_command_line_len +    1312         size_t len = saved_command_line_len + 1;
1338         char *command_line;                      1313         char *command_line;
1339                                                  1314 
1340         command_line = kzalloc(len, GFP_KERNE    1315         command_line = kzalloc(len, GFP_KERNEL);
1341         if (!command_line)                       1316         if (!command_line)
1342                 panic("%s: Failed to allocate    1317                 panic("%s: Failed to allocate %zu bytes\n", __func__, len);
1343                                                  1318 
1344         for (level = 0; level < ARRAY_SIZE(in    1319         for (level = 0; level < ARRAY_SIZE(initcall_levels) - 1; level++) {
1345                 /* Parser modifies command_li    1320                 /* Parser modifies command_line, restore it each time */
1346                 strcpy(command_line, saved_co    1321                 strcpy(command_line, saved_command_line);
1347                 do_initcall_level(level, comm    1322                 do_initcall_level(level, command_line);
1348         }                                        1323         }
1349                                                  1324 
1350         kfree(command_line);                     1325         kfree(command_line);
1351 }                                                1326 }
1352                                                  1327 
1353 /*                                               1328 /*
1354  * Ok, the machine is now initialized. None o    1329  * Ok, the machine is now initialized. None of the devices
1355  * have been touched yet, but the CPU subsyst    1330  * have been touched yet, but the CPU subsystem is up and
1356  * running, and memory and process management    1331  * running, and memory and process management works.
1357  *                                               1332  *
1358  * Now we can finally start doing some real w    1333  * Now we can finally start doing some real work..
1359  */                                              1334  */
1360 static void __init do_basic_setup(void)          1335 static void __init do_basic_setup(void)
1361 {                                                1336 {
1362         cpuset_init_smp();                       1337         cpuset_init_smp();
1363         driver_init();                           1338         driver_init();
1364         init_irq_proc();                         1339         init_irq_proc();
1365         do_ctors();                              1340         do_ctors();
1366         do_initcalls();                          1341         do_initcalls();
1367 }                                                1342 }
1368                                                  1343 
1369 static void __init do_pre_smp_initcalls(void)    1344 static void __init do_pre_smp_initcalls(void)
1370 {                                                1345 {
1371         initcall_entry_t *fn;                    1346         initcall_entry_t *fn;
1372                                                  1347 
1373         trace_initcall_level("early");           1348         trace_initcall_level("early");
1374         for (fn = __initcall_start; fn < __in    1349         for (fn = __initcall_start; fn < __initcall0_start; fn++)
1375                 do_one_initcall(initcall_from    1350                 do_one_initcall(initcall_from_entry(fn));
1376 }                                                1351 }
1377                                                  1352 
1378 static int run_init_process(const char *init_    1353 static int run_init_process(const char *init_filename)
1379 {                                                1354 {
1380         const char *const *p;                    1355         const char *const *p;
1381                                                  1356 
1382         argv_init[0] = init_filename;            1357         argv_init[0] = init_filename;
1383         pr_info("Run %s as init process\n", i    1358         pr_info("Run %s as init process\n", init_filename);
1384         pr_debug("  with arguments:\n");         1359         pr_debug("  with arguments:\n");
1385         for (p = argv_init; *p; p++)             1360         for (p = argv_init; *p; p++)
1386                 pr_debug("    %s\n", *p);        1361                 pr_debug("    %s\n", *p);
1387         pr_debug("  with environment:\n");       1362         pr_debug("  with environment:\n");
1388         for (p = envp_init; *p; p++)             1363         for (p = envp_init; *p; p++)
1389                 pr_debug("    %s\n", *p);        1364                 pr_debug("    %s\n", *p);
1390         return kernel_execve(init_filename, a    1365         return kernel_execve(init_filename, argv_init, envp_init);
1391 }                                                1366 }
1392                                                  1367 
1393 static int try_to_run_init_process(const char    1368 static int try_to_run_init_process(const char *init_filename)
1394 {                                                1369 {
1395         int ret;                                 1370         int ret;
1396                                                  1371 
1397         ret = run_init_process(init_filename)    1372         ret = run_init_process(init_filename);
1398                                                  1373 
1399         if (ret && ret != -ENOENT) {             1374         if (ret && ret != -ENOENT) {
1400                 pr_err("Starting init: %s exi    1375                 pr_err("Starting init: %s exists but couldn't execute it (error %d)\n",
1401                        init_filename, ret);      1376                        init_filename, ret);
1402         }                                        1377         }
1403                                                  1378 
1404         return ret;                              1379         return ret;
1405 }                                                1380 }
1406                                                  1381 
1407 static noinline void __init kernel_init_freea    1382 static noinline void __init kernel_init_freeable(void);
1408                                                  1383 
1409 #if defined(CONFIG_STRICT_KERNEL_RWX) || defi    1384 #if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
1410 bool rodata_enabled __ro_after_init = true;      1385 bool rodata_enabled __ro_after_init = true;
1411                                                  1386 
1412 #ifndef arch_parse_debug_rodata                  1387 #ifndef arch_parse_debug_rodata
1413 static inline bool arch_parse_debug_rodata(ch    1388 static inline bool arch_parse_debug_rodata(char *str) { return false; }
1414 #endif                                           1389 #endif
1415                                                  1390 
1416 static int __init set_debug_rodata(char *str)    1391 static int __init set_debug_rodata(char *str)
1417 {                                                1392 {
1418         if (arch_parse_debug_rodata(str))        1393         if (arch_parse_debug_rodata(str))
1419                 return 0;                        1394                 return 0;
1420                                                  1395 
1421         if (str && !strcmp(str, "on"))           1396         if (str && !strcmp(str, "on"))
1422                 rodata_enabled = true;           1397                 rodata_enabled = true;
1423         else if (str && !strcmp(str, "off"))     1398         else if (str && !strcmp(str, "off"))
1424                 rodata_enabled = false;          1399                 rodata_enabled = false;
1425         else                                     1400         else
1426                 pr_warn("Invalid option strin    1401                 pr_warn("Invalid option string for rodata: '%s'\n", str);
1427         return 0;                                1402         return 0;
1428 }                                                1403 }
1429 early_param("rodata", set_debug_rodata);         1404 early_param("rodata", set_debug_rodata);
1430 #endif                                           1405 #endif
1431                                                  1406 
                                                   >> 1407 #ifdef CONFIG_STRICT_KERNEL_RWX
1432 static void mark_readonly(void)                  1408 static void mark_readonly(void)
1433 {                                                1409 {
1434         if (IS_ENABLED(CONFIG_STRICT_KERNEL_R !! 1410         if (rodata_enabled) {
1435                 /*                               1411                 /*
1436                  * load_module() results in W    1412                  * load_module() results in W+X mappings, which are cleaned
1437                  * up with init_free_wq. Let'    1413                  * up with init_free_wq. Let's make sure that queued work is
1438                  * flushed so that we don't h    1414                  * flushed so that we don't hit false positives looking for
1439                  * insecure pages which are W    1415                  * insecure pages which are W+X.
1440                  */                              1416                  */
1441                 flush_module_init_free_work()    1417                 flush_module_init_free_work();
1442                 jump_label_init_ro();         << 
1443                 mark_rodata_ro();                1418                 mark_rodata_ro();
1444                 debug_checkwx();              << 
1445                 rodata_test();                   1419                 rodata_test();
1446         } else if (IS_ENABLED(CONFIG_STRICT_K !! 1420         } else
1447                 pr_info("Kernel memory protec    1421                 pr_info("Kernel memory protection disabled.\n");
1448         } else if (IS_ENABLED(CONFIG_ARCH_HAS << 
1449                 pr_warn("Kernel memory protec << 
1450         } else {                              << 
1451                 pr_warn("This architecture do << 
1452         }                                     << 
1453 }                                                1422 }
                                                   >> 1423 #elif defined(CONFIG_ARCH_HAS_STRICT_KERNEL_RWX)
                                                   >> 1424 static inline void mark_readonly(void)
                                                   >> 1425 {
                                                   >> 1426         pr_warn("Kernel memory protection not selected by kernel config.\n");
                                                   >> 1427 }
                                                   >> 1428 #else
                                                   >> 1429 static inline void mark_readonly(void)
                                                   >> 1430 {
                                                   >> 1431         pr_warn("This architecture does not have kernel memory protection.\n");
                                                   >> 1432 }
                                                   >> 1433 #endif
1454                                                  1434 
1455 void __weak free_initmem(void)                   1435 void __weak free_initmem(void)
1456 {                                                1436 {
1457         free_initmem_default(POISON_FREE_INIT    1437         free_initmem_default(POISON_FREE_INITMEM);
1458 }                                                1438 }
1459                                                  1439 
1460 static int __ref kernel_init(void *unused)       1440 static int __ref kernel_init(void *unused)
1461 {                                                1441 {
1462         int ret;                                 1442         int ret;
1463                                                  1443 
1464         /*                                       1444         /*
1465          * Wait until kthreadd is all set-up.    1445          * Wait until kthreadd is all set-up.
1466          */                                      1446          */
1467         wait_for_completion(&kthreadd_done);     1447         wait_for_completion(&kthreadd_done);
1468                                                  1448 
1469         kernel_init_freeable();                  1449         kernel_init_freeable();
1470         /* need to finish all async __init co    1450         /* need to finish all async __init code before freeing the memory */
1471         async_synchronize_full();                1451         async_synchronize_full();
1472                                                  1452 
1473         system_state = SYSTEM_FREEING_INITMEM    1453         system_state = SYSTEM_FREEING_INITMEM;
1474         kprobe_free_init_mem();                  1454         kprobe_free_init_mem();
1475         ftrace_free_init_mem();                  1455         ftrace_free_init_mem();
1476         kgdb_free_init_mem();                    1456         kgdb_free_init_mem();
1477         exit_boot_config();                      1457         exit_boot_config();
1478         free_initmem();                          1458         free_initmem();
1479         mark_readonly();                         1459         mark_readonly();
1480                                                  1460 
1481         /*                                       1461         /*
1482          * Kernel mappings are now finalized     1462          * Kernel mappings are now finalized - update the userspace page-table
1483          * to finalize PTI.                      1463          * to finalize PTI.
1484          */                                      1464          */
1485         pti_finalize();                          1465         pti_finalize();
1486                                                  1466 
1487         system_state = SYSTEM_RUNNING;           1467         system_state = SYSTEM_RUNNING;
1488         numa_default_policy();                   1468         numa_default_policy();
1489                                                  1469 
1490         rcu_end_inkernel_boot();                 1470         rcu_end_inkernel_boot();
1491                                                  1471 
1492         do_sysctl_args();                        1472         do_sysctl_args();
1493                                                  1473 
1494         if (ramdisk_execute_command) {           1474         if (ramdisk_execute_command) {
1495                 ret = run_init_process(ramdis    1475                 ret = run_init_process(ramdisk_execute_command);
1496                 if (!ret)                        1476                 if (!ret)
1497                         return 0;                1477                         return 0;
1498                 pr_err("Failed to execute %s     1478                 pr_err("Failed to execute %s (error %d)\n",
1499                        ramdisk_execute_comman    1479                        ramdisk_execute_command, ret);
1500         }                                        1480         }
1501                                                  1481 
1502         /*                                       1482         /*
1503          * We try each of these until one suc    1483          * We try each of these until one succeeds.
1504          *                                       1484          *
1505          * The Bourne shell can be used inste    1485          * The Bourne shell can be used instead of init if we are
1506          * trying to recover a really broken     1486          * trying to recover a really broken machine.
1507          */                                      1487          */
1508         if (execute_command) {                   1488         if (execute_command) {
1509                 ret = run_init_process(execut    1489                 ret = run_init_process(execute_command);
1510                 if (!ret)                        1490                 if (!ret)
1511                         return 0;                1491                         return 0;
1512                 panic("Requested init %s fail    1492                 panic("Requested init %s failed (error %d).",
1513                       execute_command, ret);     1493                       execute_command, ret);
1514         }                                        1494         }
1515                                                  1495 
1516         if (CONFIG_DEFAULT_INIT[0] != '\0') {    1496         if (CONFIG_DEFAULT_INIT[0] != '\0') {
1517                 ret = run_init_process(CONFIG    1497                 ret = run_init_process(CONFIG_DEFAULT_INIT);
1518                 if (ret)                         1498                 if (ret)
1519                         pr_err("Default init     1499                         pr_err("Default init %s failed (error %d)\n",
1520                                CONFIG_DEFAULT    1500                                CONFIG_DEFAULT_INIT, ret);
1521                 else                             1501                 else
1522                         return 0;                1502                         return 0;
1523         }                                        1503         }
1524                                                  1504 
1525         if (!try_to_run_init_process("/sbin/i    1505         if (!try_to_run_init_process("/sbin/init") ||
1526             !try_to_run_init_process("/etc/in    1506             !try_to_run_init_process("/etc/init") ||
1527             !try_to_run_init_process("/bin/in    1507             !try_to_run_init_process("/bin/init") ||
1528             !try_to_run_init_process("/bin/sh    1508             !try_to_run_init_process("/bin/sh"))
1529                 return 0;                        1509                 return 0;
1530                                                  1510 
1531         panic("No working init found.  Try pa    1511         panic("No working init found.  Try passing init= option to kernel. "
1532               "See Linux Documentation/admin-    1512               "See Linux Documentation/admin-guide/init.rst for guidance.");
1533 }                                                1513 }
1534                                                  1514 
1535 /* Open /dev/console, for stdin/stdout/stderr    1515 /* Open /dev/console, for stdin/stdout/stderr, this should never fail */
1536 void __init console_on_rootfs(void)              1516 void __init console_on_rootfs(void)
1537 {                                                1517 {
1538         struct file *file = filp_open("/dev/c    1518         struct file *file = filp_open("/dev/console", O_RDWR, 0);
1539                                                  1519 
1540         if (IS_ERR(file)) {                      1520         if (IS_ERR(file)) {
1541                 pr_err("Warning: unable to op    1521                 pr_err("Warning: unable to open an initial console.\n");
1542                 return;                          1522                 return;
1543         }                                        1523         }
1544         init_dup(file);                          1524         init_dup(file);
1545         init_dup(file);                          1525         init_dup(file);
1546         init_dup(file);                          1526         init_dup(file);
1547         fput(file);                              1527         fput(file);
1548 }                                                1528 }
1549                                                  1529 
1550 static noinline void __init kernel_init_freea    1530 static noinline void __init kernel_init_freeable(void)
1551 {                                                1531 {
1552         /* Now the scheduler is fully set up     1532         /* Now the scheduler is fully set up and can do blocking allocations */
1553         gfp_allowed_mask = __GFP_BITS_MASK;      1533         gfp_allowed_mask = __GFP_BITS_MASK;
1554                                                  1534 
1555         /*                                       1535         /*
1556          * init can allocate pages on any nod    1536          * init can allocate pages on any node
1557          */                                      1537          */
1558         set_mems_allowed(node_states[N_MEMORY    1538         set_mems_allowed(node_states[N_MEMORY]);
1559                                                  1539 
1560         cad_pid = get_pid(task_pid(current));    1540         cad_pid = get_pid(task_pid(current));
1561                                                  1541 
1562         smp_prepare_cpus(setup_max_cpus);        1542         smp_prepare_cpus(setup_max_cpus);
1563                                                  1543 
1564         workqueue_init();                        1544         workqueue_init();
1565                                                  1545 
1566         init_mm_internals();                     1546         init_mm_internals();
1567                                                  1547 
1568         rcu_init_tasks_generic();                1548         rcu_init_tasks_generic();
1569         do_pre_smp_initcalls();                  1549         do_pre_smp_initcalls();
1570         lockup_detector_init();                  1550         lockup_detector_init();
1571                                                  1551 
1572         smp_init();                              1552         smp_init();
1573         sched_init_smp();                        1553         sched_init_smp();
1574                                                  1554 
1575         workqueue_init_topology();               1555         workqueue_init_topology();
1576         async_init();                         << 
1577         padata_init();                           1556         padata_init();
1578         page_alloc_init_late();                  1557         page_alloc_init_late();
1579                                                  1558 
1580         do_basic_setup();                        1559         do_basic_setup();
1581                                                  1560 
1582         kunit_run_all_tests();                   1561         kunit_run_all_tests();
1583                                                  1562 
1584         wait_for_initramfs();                    1563         wait_for_initramfs();
1585         console_on_rootfs();                     1564         console_on_rootfs();
1586                                                  1565 
1587         /*                                       1566         /*
1588          * check if there is an early userspa    1567          * check if there is an early userspace init.  If yes, let it do all
1589          * the work                              1568          * the work
1590          */                                      1569          */
1591         if (init_eaccess(ramdisk_execute_comm    1570         if (init_eaccess(ramdisk_execute_command) != 0) {
1592                 ramdisk_execute_command = NUL    1571                 ramdisk_execute_command = NULL;
1593                 prepare_namespace();             1572                 prepare_namespace();
1594         }                                        1573         }
1595                                                  1574 
1596         /*                                       1575         /*
1597          * Ok, we have completed the initial     1576          * Ok, we have completed the initial bootup, and
1598          * we're essentially up and running.     1577          * we're essentially up and running. Get rid of the
1599          * initmem segments and start the use    1578          * initmem segments and start the user-mode stuff..
1600          *                                       1579          *
1601          * rootfs is available now, try loadi    1580          * rootfs is available now, try loading the public keys
1602          * and default modules                   1581          * and default modules
1603          */                                      1582          */
1604                                                  1583 
1605         integrity_load_keys();                   1584         integrity_load_keys();
1606 }                                                1585 }
1607                                                  1586 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php