~ [ 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 ccs-tools-1.8.12)


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

~ [ 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