1 /* 2 * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 3 * Licensed under the GPL 4 */ 5 6 #include <linux/init.h> 7 #include <linux/sched/mm.h> 8 #include <linux/sched/task_stack.h> 9 #include <linux/sched/task.h> 10 11 #include <as-layout.h> 12 #include <kern.h> 13 #include <os.h> 14 #include <skas.h> 15 16 extern void start_kernel(void); 17 18 static int __init start_kernel_proc(void *unused) 19 { 20 int pid; 21 22 block_signals(); 23 pid = os_getpid(); 24 25 cpu_tasks[0].pid = pid; 26 cpu_tasks[0].task = current; 27 28 start_kernel(); 29 return 0; 30 } 31 32 extern int userspace_pid[]; 33 34 extern char cpu0_irqstack[]; 35 36 int __init start_uml(void) 37 { 38 stack_protections((unsigned long) &cpu0_irqstack); 39 set_sigstack(cpu0_irqstack, THREAD_SIZE); 40 41 init_new_thread_signals(); 42 43 init_task.thread.request.u.thread.proc = start_kernel_proc; 44 init_task.thread.request.u.thread.arg = NULL; 45 return start_idle_thread(task_stack_page(&init_task), 46 &init_task.thread.switch_buf); 47 } 48 49 unsigned long current_stub_stack(void) 50 { 51 if (current->mm == NULL) 52 return 0; 53 54 return current->mm->context.id.stack; 55 } 56