LCOV - code coverage report
Current view: top level - init - main.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 352 528 66.7 %
Date: 2021-04-22 12:43:58 Functions: 32 48 66.7 %

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

Generated by: LCOV version 1.14