Merge tag 'block-6.1-2022-11-11' of git://git.kernel.dk/linux
[platform/kernel/linux-starfive.git] / init / main.c
index 1fe7942..aa21add 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/percpu.h>
 #include <linux/kmod.h>
 #include <linux/kprobes.h>
+#include <linux/kmsan.h>
 #include <linux/vmalloc.h>
 #include <linux/kernel_stat.h>
 #include <linux/start_kernel.h>
@@ -117,6 +118,7 @@ static int kernel_init(void *);
 
 extern void init_IRQ(void);
 extern void radix_tree_init(void);
+extern void maple_tree_init(void);
 
 /*
  * Debug helper: via this flag we know that we are in 'early bootup code'
@@ -422,7 +424,7 @@ static void __init setup_boot_config(void)
        if (!data)
                data = xbc_get_embedded_bootconfig(&size);
 
-       strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
+       strscpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
        err = parse_args("bootconfig", tmp_cmdline, NULL, 0, 0, 0, NULL,
                         bootconfig_params);
 
@@ -762,7 +764,7 @@ void __init parse_early_param(void)
                return;
 
        /* All fall through to do_early_param. */
-       strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
+       strscpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
        parse_early_options(tmp_cmdline);
        done = 1;
 }
@@ -836,6 +838,7 @@ static void __init mm_init(void)
        init_mem_debugging_and_hardening();
        kfence_alloc_pool();
        report_meminit();
+       kmsan_init_shadow();
        stack_depot_early_init();
        mem_init();
        mem_init_print_info();
@@ -849,10 +852,14 @@ static void __init mm_init(void)
        pgtable_init();
        debug_objects_mem_init();
        vmalloc_init();
+       /* Should be run after vmap initialization */
+       if (early_page_ext_enabled())
+               page_ext_init();
        /* Should be run before the first non-init thread is created */
        init_espfix_bsp();
        /* Should be run after espfix64 is set up. */
        pti_init();
+       kmsan_init_runtime();
 }
 
 #ifdef CONFIG_RANDOMIZE_KSTACK_OFFSET
@@ -976,6 +983,9 @@ asmlinkage __visible void __init __no_sanitize_address start_kernel(void)
                parse_args("Setting extra init args", extra_init_args,
                           NULL, 0, -1, -1, NULL, set_init_arg);
 
+       /* Architectural and non-timekeeping rng init, before allocator init */
+       random_init_early(command_line);
+
        /*
         * These use large bootmem allocations and must precede
         * kmem_cache_init()
@@ -1002,6 +1012,7 @@ asmlinkage __visible void __init __no_sanitize_address start_kernel(void)
                 "Interrupts were enabled *very* early, fixing it\n"))
                local_irq_disable();
        radix_tree_init();
+       maple_tree_init();
 
        /*
         * Set up housekeeping before setting up workqueues to allow the unbound
@@ -1035,17 +1046,13 @@ asmlinkage __visible void __init __no_sanitize_address start_kernel(void)
        hrtimers_init();
        softirq_init();
        timekeeping_init();
-       kfence_init();
        time_init();
 
-       /*
-        * For best initial stack canary entropy, prepare it after:
-        * - setup_arch() for any UEFI RNG entropy and boot cmdline access
-        * - timekeeping_init() for ktime entropy used in random_init()
-        * - time_init() for making random_get_entropy() work on some platforms
-        * - random_init() to initialize the RNG from from early entropy sources
-        */
-       random_init(command_line);
+       /* This must be after timekeeping is initialized */
+       random_init();
+
+       /* These make use of the fully initialized rng */
+       kfence_init();
        boot_init_stack_canary();
 
        perf_event_init();
@@ -1237,7 +1244,7 @@ __setup("initcall_blacklist=", initcall_blacklist);
 static __init_or_module void
 trace_initcall_start_cb(void *data, initcall_t fn)
 {
-       ktime_t *calltime = (ktime_t *)data;
+       ktime_t *calltime = data;
 
        printk(KERN_DEBUG "calling  %pS @ %i\n", fn, task_pid_nr(current));
        *calltime = ktime_get();
@@ -1246,7 +1253,7 @@ trace_initcall_start_cb(void *data, initcall_t fn)
 static __init_or_module void
 trace_initcall_finish_cb(void *data, initcall_t fn, int ret)
 {
-       ktime_t rettime, *calltime = (ktime_t *)data;
+       ktime_t rettime, *calltime = data;
 
        rettime = ktime_get();
        printk(KERN_DEBUG "initcall %pS returned %d after %lld usecs\n",
@@ -1618,7 +1625,8 @@ static noinline void __init kernel_init_freeable(void)
        padata_init();
        page_alloc_init_late();
        /* Initialize page ext after all struct pages are initialized. */
-       page_ext_init();
+       if (!early_page_ext_enabled())
+               page_ext_init();
 
        do_basic_setup();