summaryrefslogtreecommitdiffstats
path: root/init/main.c
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2018-08-31 10:42:24 +0200
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2018-10-09 11:20:55 +0200
commit53c99bd665a2649341ed6aed358ab56a3eedcd00 (patch)
treeb7fb2be29c66039b6f986f988e064bfdff7dd392 /init/main.c
parent00e9e6645adc2c02c9ec5b42fd39d2a7f0880e6a (diff)
downloadlinux-53c99bd665a2649341ed6aed358ab56a3eedcd00.tar.bz2
init: add arch_call_rest_init to allow stack switching
With CONFIG_VMAP_STACK=y the kernel stack of all tasks should be allocated in the vmalloc space. The initial stack used for all the early init code is in the init_thread_union. To be able to switch from this early stack to a properly allocated stack from vmalloc the architecture needs a switch-over point. Introduce the arch_call_rest_init() function with a weak definition in init/main.c with the only purpose to call rest_init() from the end of start_kernel(). The architecture override can then do the necessary magic to switch to the new vmalloc'ed stack. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'init/main.c')
-rw-r--r--init/main.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/init/main.c b/init/main.c
index 18f8f0140fa0..78b714a5fa94 100644
--- a/init/main.c
+++ b/init/main.c
@@ -394,7 +394,7 @@ static void __init setup_command_line(char *command_line)
static __initdata DECLARE_COMPLETION(kthreadd_done);
-static noinline void __ref rest_init(void)
+noinline void __ref rest_init(void)
{
struct task_struct *tsk;
int pid;
@@ -528,6 +528,11 @@ static void __init mm_init(void)
pti_init();
}
+void __init __weak arch_call_rest_init(void)
+{
+ rest_init();
+}
+
asmlinkage __visible void __init start_kernel(void)
{
char *command_line;
@@ -736,7 +741,7 @@ asmlinkage __visible void __init start_kernel(void)
}
/* Do the rest non-__init'ed, we're now alive */
- rest_init();
+ arch_call_rest_init();
}
/* Call all constructor functions linked into the kernel. */