1 /* 2 * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) 3 * Licensed under the GPL 4 */ 5 6 #include "linux/sched.h" 7 #include "linux/slab.h" 8 #include "linux/ptrace.h" 9 #include "linux/proc_fs.h" 10 #include "linux/file.h" 11 #include "linux/errno.h" 12 #include "linux/init.h" 13 #include "asm/uaccess.h" 14 #include "asm/atomic.h" 15 #include "kern_util.h" 16 #include "as-layout.h" 17 #include "skas.h" 18 #include "os.h" 19 #include "tlb.h" 20 #include "kern.h" 21 #include "registers.h" 22 23 extern void schedule_tail(struct task_struct *prev); 24 25 int new_mm(unsigned long stack) 26 { 27 int fd; 28 29 fd = os_open_file("/proc/mm", of_cloexec(of_write(OPENFLAGS())), 0); 30 if(fd < 0) 31 return fd; 32 33 if(skas_needs_stub) 34 map_stub_pages(fd, CONFIG_STUB_CODE, CONFIG_STUB_DATA, stack); 35 36 return fd; 37 } 38 39 extern void start_kernel(void); 40 41 static int __init start_kernel_proc(void *unused) 42 { 43 int pid; 44 45 block_signals(); 46 pid = os_getpid(); 47 48 cpu_tasks[0].pid = pid; 49 cpu_tasks[0].task = current; 50 #ifdef CONFIG_SMP 51 cpu_online_map = cpumask_of_cpu(0); 52 #endif 53 start_kernel(); 54 return 0; 55 } 56 57 extern int userspace_pid[]; 58 59 extern char cpu0_irqstack[]; 60 61 int __init start_uml(void) 62 { 63 stack_protections((unsigned long) &cpu0_irqstack); 64 set_sigstack(cpu0_irqstack, THREAD_SIZE); 65 if(proc_mm) 66 userspace_pid[0] = start_userspace(0); 67 68 init_new_thread_signals(); 69 70 init_task.thread.request.u.thread.proc = start_kernel_proc; 71 init_task.thread.request.u.thread.arg = NULL; 72 return start_idle_thread(task_stack_page(&init_task), 73 &init_task.thread.switch_buf); 74 } 75 76 unsigned long current_stub_stack(void) 77 { 78 if(current->mm == NULL) 79 return 0; 80 81 return current->mm->context.skas.id.stack; 82 } 83