um: Move uml_postsetup in the init_thread stack
atomic_notifier_chain_register() and uml_postsetup() do call kernel code that rely on the "current" kernel macro and a valid task_struct resp. thread_info struct. Give those functions a valid stack by moving uml_postsetup() in the init_thread stack. This moves enables a panic() call in this early code to generate a valid stacktrace, instead of crashing. E.g. when an UML kernel is started with an initrd but too few physical memory the panic() call get's actually processed. Signed-off-by: Thomas Meyer <thomas@m3y3r.de> Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
04a418495e
commit
33bbc30654
|
@ -56,6 +56,7 @@ extern unsigned long brk_start;
|
|||
extern unsigned long host_task_size;
|
||||
|
||||
extern int linux_main(int argc, char **argv);
|
||||
extern void uml_finishsetup(void);
|
||||
|
||||
struct siginfo;
|
||||
extern void (*sig_info[])(int, struct siginfo *si, struct uml_pt_regs *);
|
||||
|
|
|
@ -226,6 +226,16 @@ static struct notifier_block panic_exit_notifier = {
|
|||
.priority = 0
|
||||
};
|
||||
|
||||
void uml_finishsetup(void)
|
||||
{
|
||||
atomic_notifier_chain_register(&panic_notifier_list,
|
||||
&panic_exit_notifier);
|
||||
|
||||
uml_postsetup();
|
||||
|
||||
new_thread_handler();
|
||||
}
|
||||
|
||||
/* Set during early boot */
|
||||
unsigned long task_size;
|
||||
EXPORT_SYMBOL(task_size);
|
||||
|
@ -326,11 +336,6 @@ int __init linux_main(int argc, char **argv)
|
|||
printf("Kernel virtual memory size shrunk to %lu bytes\n",
|
||||
virtmem_size);
|
||||
|
||||
atomic_notifier_chain_register(&panic_notifier_list,
|
||||
&panic_exit_notifier);
|
||||
|
||||
uml_postsetup();
|
||||
|
||||
stack_protections((unsigned long) &init_thread_info);
|
||||
os_flush_stdout();
|
||||
|
||||
|
|
|
@ -586,7 +586,7 @@ int start_idle_thread(void *stack, jmp_buf *switch_buf)
|
|||
n = setjmp(initial_jmpbuf);
|
||||
switch (n) {
|
||||
case INIT_JMP_NEW_THREAD:
|
||||
(*switch_buf)[0].JB_IP = (unsigned long) new_thread_handler;
|
||||
(*switch_buf)[0].JB_IP = (unsigned long) uml_finishsetup;
|
||||
(*switch_buf)[0].JB_SP = (unsigned long) stack +
|
||||
UM_THREAD_SIZE - sizeof(void *);
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue